我想反转二进制树中的节点,如下所示:
[[ [ [[],1,[]], 5, []],
7,
[ [], 3, [[],4,[]]]],
6,
[ [ [], 10, []],
8,
[ [[],9,[]], 11, [[],2,[]]]]]
我只能将此ABN表示用作列表以及抽象数据类型的以下构造函数和选择器。
empty([]).
root([_,N,_], N).
hi([HI,_,_],HI). %left son
hd([_,_,HD],HD). %right son
maketree(R,HI,HD,[HI,R,HD]).
我想知道如何制作像这样swap(A4,B).
的交换谓词:
?- swap(A4,B).
B=[[[[[],2,[]],11,[[],9,[]]],8,[[],10,[]]],6,[[[[],4,[]],3,[]],7,[[],5,[[],1,[]]]]]
谢谢!
答案 0 :(得分:2)
对于抽象数据类型,您可以将接口谓词视为不透明:
% empty([]).
% root(Tree, Root).
left_child(Tree,Left):- hi(Tree,Left).
right_child(Tree,Right):- hd(Tree,Right).
mktree(Top,Left,Right,Tree):- maketree(Top,Left,Right,Tree).
要交换树中的两个节点,只需
swapped_tree(Tree, SwappedTree):-
left_child(Tree, Left ),
right_child(Tree, Right ),
root(Tree, Root ),
% and then combine them in a simple way,
mktree( ..., ..., ..., SwappedTree).
Prolog与英语一样。
但那里的节点保持不变。要让新树成为原始树的完整镜像,在创建新镜像之前,您将希望以与整个树相同的方式处理子节点 树:
mirrored_tree(Tree, MirroredTree) :-
.... ,
.... ,
.... ,
mirrored_tree( ..., ... ),
mirrored_tree( ..., ... ),
.... .
使用你仍在编写的谓词(好像它已经写好了)来解决完整问题的子部分具有相同性质作为完整问题,并重新组合结果一些简单方式来获得完整问题的解决方案,是递归的本质。