prolog从左到右遍历非标准树

Posted

技术标签:

【中文标题】prolog从左到右遍历非标准树【英文标题】:prolog traverse nonstandard tree left to right 【发布时间】:2015-06-07 00:48:37 【问题描述】:

我需要实现一个谓词trav(Tree,List),它执行左到 右树遍历;

其中:树由结构节点(left,right)定义,其中left和right可以是另一个节点或任何Prolog数据项。 List 是树中叶节点值的列表。

例如:

?- trav(x,L).
L = [x].
?- trav(node(1,node(2,node(a,b))),L).
L = [1, 2, a, b] .

到目前为止我所拥有的:

trav(tree,[ ]).
trav(node(Left,Rigth), L) :-
    trav(Left, L),
    trav(Right, L),
    append(Left,[Left|Right],L).

【问题讨论】:

你又遇到了你想要一棵树的问题! 首先定义一个谓词is_tree/1,它说明你认为一棵树是什么。这是非常不常见的,但当然可以有没有元素的节点。这样的节点通常出现在表达式树中。但否则它们不会发生。 不是我的意见,这是我被赋予的工作。 【参考方案1】:

我的 Prolog 有点生锈,但我相信应该这样做:

node(Left, Right).

trav(node(Left, Right), L) :- 
  trav(Left, L1), 
  trav(Right, L2),
  append(L1, L2, L).
trav(X, [X]) :- X \= node(A, B).

直观地说,trav(Left, L1) 表示遍历左子树,将每个元素存储在L1 中。 trav(Right, L2) 表示遍历右子树,将每个元素存储在L2 中。最后,append(L1, L2, L) 将两个列表 L1 and L2 附加到列表 L 中。对于叶子trav(X, [X]),只要它不与node 统一,就将X 放入单例列表中。

【讨论】:

在打印第一行后停止它是否正确,如果是,您如何或在哪里放置切口? 1 ?- trav(node(1,node(2,node(a,b))),L). L = [1, 2, a, b] ; L = [1, 2, node(a, b)] ; L = [1, node(2, node(a, b))] ; L = [node(1, node(2, node(a, b)))]. 是否可以显式注释树的叶子?因此,您的查询看起来更像:trav(node(leaf(1),node(leaf(2),node(leaf(a),leaf(b)))),L). 这在我编辑的答案中只有一个解决方案。 我上面提供的例子是什么都会用到的! OK @user3633383,应该这样做

以上是关于prolog从左到右遍历非标准树的主要内容,如果未能解决你的问题,请参考以下文章

树的遍历

ARM SVE 从左到右与树减少

W3C标准

python 在python中从左到右构造一个b树

瓜分领土(线段树)

python 用于2D阵列的从左到右从上到下遍历的指数生成器