在prolog中交换二进制树

vin*_*ent 1 recursion swap prolog

这是来自Learn Prolog Now的练习3.5 .他们在解释列表之前把它放在一边所以我需要一个不涉及列表的过程.

任务是交换嵌套二叉树的叶子.如果查询是

swap(tree(tree(leaf(1), leaf(2)), leaf(4)), T).
Run Code Online (Sandbox Code Playgroud)

答案应该是

T = (tree(leaf(4), tree(leaf(2), leaf(1))).
Run Code Online (Sandbox Code Playgroud)

swap((X, Y), (Y, X)).

swap(tree(X, Y), T) :- 
   swap((X, Y), (Y, X)), 
   T = (Y, X).
Run Code Online (Sandbox Code Playgroud)

我明白了

T = (leaf(4), tree(leaf(1), leaf(2))).
Run Code Online (Sandbox Code Playgroud)

如你所见leaf(1),leaf(2)并没有得到交换.我想要一些提示甚至你的程序,它应该适用于任何深度的节点.谢谢.

joe*_*l76 6

你有一个基础案例交换叶子,一般情况交换树!对于一片叶子,无事可做:

swap(leaf(X), leaf(X)).
Run Code Online (Sandbox Code Playgroud)

当你交换树时,你也必须交换树叶,所以

swap(tree(X,Y), tree(Y1,X1)) :-
    swap(X,X1),
    swap(Y,Y1).
Run Code Online (Sandbox Code Playgroud)