如何用prolog替换二叉树中的匹配节点?树的属性:它不是二叉查找树,但每个元素都是唯一的,所以替换操作最多会影响树中的一个元素。在二叉树的匹配位置替换树节点
初始树的定义:
tree('Q',
tree('P',
tree('R',
empty,
empty),
tree('S',
empty,
empty)),
tree('T',
empty,
empty))
比方说,新的节点与树( '新',树( 'child1' 来代替节点 'R',空,空),树( '的child2',空,空)) 预期的结果:
tree('Q',
tree('P',
tree(tree('new',
tree('child1',
empty,
empty),
tree('child2',
empty,
empty)),
tree('S',
empty,
empty)
)),
tree('T',
empty,
empty))
当前代码的状态:
:- dynamic([tree/1]).
run:-
retractall(tree(_)),
assertz(tree(tree('Q', tree('P', tree('R', empty, empty), tree('S', empty, empty)), tree('T', empty, empty)))),
retract(tree(T)),
insert('newElement', T, NewTree),
assertz(tree(NewTree)),
tree(T),write(T),!.
insert(NewItem,empty,tree(NewItem,empty,empty)):- !.
insert(NewItem,tree(Element,Left,Right),tree(Element,NewLeft,Right)):-
true, %match function needs to be here
!,insert(NewItem,Left,NewLeft).
insert(NewItem,tree(Element,Left,Right),tree(Element,Left,NewRight)):-
insert(NewItem,Right,NewRight).
它可能发生,你碰巧是树已经是另一个元素替换元素,从而使元素非唯一? – 2014-11-01 10:52:58
不,这将在使用replace命令之前处理完毕,并且会通知用户不要添加同一个实体,否则实体将使用前缀进行标记以确保一致性和唯一性@Boris。 – 2014-11-01 10:55:24
你期望在你的例子中得到的树不是一个结构良好的树。你应该尝试解决这个问题,否则就不清楚替换应该如何工作。或者你真的认为一个节点本身可以是一棵树吗?如果是这样,请记住遍历不会遍历其中包含的树。 – 2014-11-01 11:05:26