有没有人知道在Prolog中构建完全平衡树的任何简单方法?
这是我找到的一个解决方案,但我想知道是否有人知道任何更简单的解决方案?
这个很简单,但是我花了一点时间来准确掌握它是如何工作的。
谢谢:)。
% from given solution
cbal_tree( 0, nil ) :- !.
cbal_tree( N, t(x,L,R) ) :-
N > 0,
N0 is N - 1, % if N is 4, this would be 3
N1 is N0 mod 2, % if N is 4, this would be 3 mod 2 = 1
N2 is N0 - N1, % if N is 4, this would be 3-1= 2
distrib( N1, N2, LeftNode, RightNode ),
cbal_tree( LeftNode, L ),
cbal_tree( RightNode, R ).
distrib(N,N,N,N) :- !.
distrib(N1,N2,N1,N2). % giving these two clauses (*) 1,2,?,? could give 1,2 or 2,1
distrib(N1,N2,N2,N1). % (*)
答案 0 :(得分:1)
The accepted answer is wrong.
Consider the case when N=5. The one subtree takes as argument the number 4 and the other the number 0. That is not a balanced tree.
Instead, I propose the following code:
cbal_tree(0, nil).
cbal_tree(N, t(x,L,R)) :-
N > 0,
N0 is N - 1, % -1 to account for root node
N1 is N0 div 2,
N2 is N0 - N1,
(N mod 2 =\= 0 -> permutation([N1,N2], [NLeft,NRight]) ;
[N1, N2] = [NLeft, NRight]),
cbal_tree(NLeft, L),
cbal_tree(NRight, R).
The if statement is to prevent backtracking from bringing you duplicate answers.
Please consider heavily marking this as an accepted answer because the answer provided is confusing at least.
答案 1 :(得分:0)
这构建对称树:
symm_tree(nil,0).
symm_tree(t(L,R),Level) :-
Level > 0,
M is Level-1,
symm_tree(L,M),
symm_tree(R,M).
向节点添加标签应该是微不足道的。
您发布的代码可以略微简化为
cbal_tree(0, nil).
cbal_tree(N, t(x,L,R)) :-
N > 0,
N0 is N - 1, % -1 to account for root node
N1 is N0 mod 2,
N2 is N0 - N1,
permutation([N1,N2], [NLeft,NRight]),
cbal_tree(NLeft, L),
cbal_tree(NRight, R).
但这实际上是多么简单,并且distrib/3
重复项的处理已经消失。