Recursion 序言。反转树中的节点

Recursion 序言。反转树中的节点,recursion,tree,prolog,binary-tree,Recursion,Tree,Prolog,Binary Tree,我想反转二叉树中的节点,如下所示: [],1,[],5,[], 7. [ [], 3, [[],4,[]]]], 6. [ [ [], 10, []], 8. [ [[],9,[]], 11, [[],2,[]]]]] 我只能将此ABN表示用作列表以及以下抽象数据类型的构造函数和选择器 empty([])。 根([[un,N,[un],N)。 嗨(嗨,嗨,嗨,嗨)。%左子 高清(高清,高清,高清)。%好儿子 maketree(R,HI,HD,[HI,R,HD])。 我想知道如何制作这样的交

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

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

我只能将此ABN表示用作列表以及以下抽象数据类型的构造函数和选择器

empty([])。
根([[un,N,[un],N)。
嗨(嗨,嗨,嗨,嗨)。%左子
高清(高清,高清,高清)。%好儿子
maketree(R,HI,HD,[HI,R,HD])。
我想知道如何制作这样的交换谓词
swap(A4,B)。
这样工作:

?-交换(A4,B)。
B=[[],2,[],11,[],9,[],8,[],10,[],6,[[],4,[],3,[],7,[],5,[],1,[]]]
谢谢

对于抽象数据类型,可以将接口谓词视为不透明的:

%为空([])。
%根(树,根)。
左(树,左):-嗨(树,左)。
右\子(树,右):-hd(树,右)。
mktree(上、左、右、树):-maketree(上、左、右、树)。
要交换树中的两个节点,只需

swapped_树(树,SwappedTree):-
左_子(树,左),
右(树,右),,
根(树,根),
%然后以一种简单的方式将它们结合起来,
mktree(…,…,…,交换树)。
它在序言中就像在英语中一样

但那里的节点保持不变。要使新树成为原始树的完整镜像,您需要在创建新的镜像树之前,以与处理整个树相同的方式处理子节点:

镜像树(树,镜像树):-
.... ,
.... ,
.... ,
镜像_树(…,…),
镜像_树(…,…),
.... .
使用您仍在编写的谓词(好像它已经被编写)来解决完整问题中与完整问题性质相同的子部分,并以某种简单的方式重新组合结果以获得完整问题的解决方案,这是递归的本质

对于抽象数据类型,可以将接口谓词视为不透明的:

%为空([])。
%根(树,根)。
左(树,左):-嗨(树,左)。
右\子(树,右):-hd(树,右)。
mktree(上、左、右、树):-maketree(上、左、右、树)。
要交换树中的两个节点,只需

swapped_树(树,SwappedTree):-
左_子(树,左),
右(树,右),,
根(树,根),
%然后以一种简单的方式将它们结合起来,
mktree(…,…,…,交换树)。
它在序言中就像在英语中一样

但那里的节点保持不变。要使新树成为原始树的完整镜像,您需要在创建新的镜像树之前,以与处理整个树相同的方式处理子节点:

镜像树(树,镜像树):-
.... ,
.... ,
.... ,
镜像_树(…,…),
镜像_树(…,…),
.... .

使用您仍在编写的谓词(好像它已经被编写)来解决完整问题中与完整问题性质相同的子部分,并以某种简单的方式重新组合结果以获得完整问题的解决方案,这是递归的本质

到目前为止你试过什么?你能概括地描述一下互换是如何运作的吗?如果是这样,您可以将其转换为Prolog。首先描述如何交换空树(或一个节点的树)中的节点。然后根据子树递归定义交换树。重新考虑使用三元素列表来表示节点,而不是使用
t(HI,R,HD)
到目前为止您尝试了什么?你能概括地描述一下互换是如何运作的吗?如果是这样,您可以将其转换为Prolog。首先描述如何交换空树(或一个节点的树)中的节点。然后根据子树递归定义交换树。重新考虑使用三元素列表来表示节点,而不是使用
t(HI,R,HD)