序言。反转树中的节点

时间:2017-06-03 08:36:33

标签: recursion tree prolog binary-tree

我想反转二进制树中的节点,如下所示:

[[ [ [[],1,[]], 5, []],
   7,
   [ [], 3, [[],4,[]]]],
 6,
 [ [ [], 10, []],
   8,
   [ [[],9,[]], 11, [[],2,[]]]]]

enter image description here

我只能将此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,[]]]]]

谢谢!

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( ..., ... ),
    .... .

使用你仍在编写的谓词(好像它已经写好了)来解决完整问题的子部分具有相同性质作为完整问题,并重新组合结果一些简单方式来获得完整问题的解决方案,是递归的本质。