1

有人可以帮我解决 Prolog 中的问题吗?我想遍历一棵树 InOrder 。我设法在 postOrder 中做到了,因为它看起来更简单,但我不知道如何在Order 中更改它。我只假设我的代码有效,因为我不知道如何在目标部分声明一棵树。谁能帮助我。到目前为止,这是我的代码:

domains
  elem=integer
  tree=tr(elem,tree,tree);nil
  list=elem*
predicates
  preorder(tree,list)
  conc(list,list,list)
clauses
  conc([],L,L).
  conc([X|L1],L2,[X|L3]):-
                          conc(L1,L2,L3). 
  preorder(nil,[]).
  preorder(tr(R,LEFT,RIGHT),L):-
    preorder(RIGHT,L1),
    preorder(LEFT,L2),
    conc([R],L2,L3),
    conc(L3,L1,L)

.

4

1 回答 1

1

domains部分,似乎你需要改变

preorder(arb(R,LEFT,RIGHT),L):-
  ...

preorder(tr(R,LEFT,RIGHT),L):-
    ...

基本上编辑,访问顺序没有影响,因为你没有用树数据“做”任何事情......你可以改变 conc 来获得一个无序列表。为了讨论,让我们重命名谓词(记得在predicates节中声明它):

inorder(nil,[]).
inorder(tr(R,LEFT,RIGHT),L):-
    inorder(LEFT,L1),
    conc(L1,[R],X),
    inorder(RIGHT,L2),
    conc(X,L2,L).

产量

11 ?- inorder(tr(1,tr(2,tr(4,nil,nil),nil),tr(3,nil,nil)),L).
L = [4, 2, 1, 3].
于 2013-11-08T08:50:12.690 回答