如何解决如何使用Prolog在二叉树中用另一个值替换每次出现的值
我的代码有问题,我无法弄清楚为什么它对我不起作用。它在第一次出现时停止,而仅替换一次出现。任务是用二进制树中的另一个值替换每次出现的值,如下例所示。
那是一个示例树:
testTreeReplace(t2,tree(a,tree(1,tree(6,-,-),tree(9,-)),tree(8,tree(20,tree(3,-))))).
这就是我使用的代码:
replace(X,Y,TreeIn,TreeOut) :-
testTreeReplace(TreeIn,T),replaceH(X,T,TreeOut).
replaceH(X,tree(X,L,R),tree(Y,R)).
replaceH(X,tree(A,New)) :-
replaceH(X,R,New).
replaceH(X,New,R)) :-
replaceH(X,New).
输出是:
?- replace(a,b,t2,Res).
Res = tree(b,-)))) ;
Res = tree(a,tree(b,-)))) ;
false.
但应该是
Res = tree(b,-)))).
(所有a应该是b)
我不想再使用其他库。预先谢谢你
解决方法
您不应该在递归中分支,因为这意味着在答案之一中,您将只替换元素(如果匹配),在另一个答案中,您将在左子树上递归,然后在右子树的另一棵树中。
因此,我们可以首先创建一个谓词,以检查Z
是否等于X
以及是否为
replaceValue(X,Y,Z,R) :-
( X == Z
-> R = Y
; R = Z
).
然后,我们可以为树创建一个谓词,尝试替换树的值,并且在同一分支中,左右子树中的X
替换为Y
:
replaceTree(X,tree(Z,L,R),tree(Z2,L2,R2)) :-
replaceValue(X,Z,Z2),replaceTree(X,L2),R,R2).
replaceTree(_,_,-,-).
因此,这给了我们
?- replaceTree(a,b,tree(a,tree(1,tree(6,-),tree(9,-)),tree(8,tree(20,tree(3,-)))),T).
T = tree(b,tree(b,-)))) ;
false.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。