拿一棵树,制作一份清单

时间:2012-03-27 10:25:22

标签: list tree prolog

我编写了一个可以获取列表并将其更改为树的程序。

build_tree([X,Y],'Tree'(X,Y)) :- !.

build_tree([X|Y],'Tree'(X,Z)) :- build_tree(Y, Z).

如果我想要撤消该过程并取出树并将其更改回列表,我该怎么做?

4 个答案:

答案 0 :(得分:0)

请注意,您的树 - >列表转换不是函数,因为树可能对应多个列表:

?- build_tree([1, 2, 3], T).
T = 'Tree'(1, 'Tree'(2, 3)).

?- build_tree([1, 'Tree'(2, 3)], T).
T = 'Tree'(1, 'Tree'(2, 3)).

如果您想要一个可以从树生成所有列表的谓词,请从build_tree中删除剪切并将其应用于变量first参数。如果您想要确定性转换,请编写新的谓词tree_to_list

答案 1 :(得分:0)

只是好奇,那个确定性版本会如何发挥作用?假设从树中只有一个可能的列表,例如:

('Tree'('Tree'(nil, 2, nil), 5, 'Tree'(nil, 6, nil)).

给出:L = [5,2,6]

答案 2 :(得分:0)

如果从第一条规则中删除剪辑,您的代码就可以在“后退”模式下工作了:

?- build_tree([1,2,3,4],T).
T = 'Tree'(1, 'Tree'(2, 'Tree'(3, 4))) ;
false.

?- build_tree(X,$T).
X = [1, 'Tree'(2, 'Tree'(3, 4))] ;
X = [1, 2, 'Tree'(3, 4)] ;
X = [1, 2, 3, 4] ;
false.

答案 3 :(得分:0)

flatten(leaf, []).
flatten(node(L, E, R), Ls) :-
    flatten(L, Ls1),
    append(Ls1, [E], Ls2),
    flatten(R, Ls3),
    append(Ls2, Ls3, Ls). 

如果您考虑树节点(叶子,元素,叶子),例如

flatten(node(node(leaf,2,leaf),3,node(leaf,5,leaf)),X).

给出X=[2,3,5].

如果你想要bst

列表到树。

insert(E,leaf,node(leaf,E,leaf)).
insert(E,node(L,N,R),T) :-
 E >= N,
 T=node(L,N,R1),
 insert(E,R,R1).
insert(E,node(L,N,R),T) :-
 E < N,
 T=node(L1,N,R),
 insert(E,L,L1).

list_to_tree(List,Tree) :-
    list_to_tree(List,leaf,Trea2),
    Tree=Trea2.
list_to_tree([],Tree,Tree).
list_to_tree([H|T],Tree,St):-
 insert(H,Tree,R),
 list_to_tree(T,R,St).
相关问题