我编写了一个可以获取列表并将其更改为树的程序。
build_tree([X,Y],'Tree'(X,Y)) :- !.
build_tree([X|Y],'Tree'(X,Z)) :- build_tree(Y, Z).
如果我想要撤消该过程并取出树并将其更改回列表,我该怎么做?
答案 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).