穿越prolog的一棵树

时间:2013-11-08 07:23:12

标签: prolog

有人可以帮我解决Prolog中的问题。我想遍历一棵树InOrder。我设法在postOrder中这样做,因为它看起来很狡猾,但我不知道如何在inOrder中更改它。我只假设我的代码有效,因为我不知道如何在Goal部分声明一个树。任何人都可以帮助我。到目前为止,这是我的代码:

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)

1 个答案:

答案 0 :(得分:1)

来自domains部分的

似乎需要更改

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

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

编辑基本上,访问顺序没有影响,因为你没有“做”任何与树'数据...你可以只更改浓缩以获得一个inorder列表。为了讨论,让我们重命名谓词(记得在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].