2011-01-06 9 views
0

Prologで完全にバランスの取れたツリーを構築する簡単な方法を知っている人はいますか?Prolog:完全にバランスのとれたツリーの構築

これは私が見つけた1つの解決策ですが、誰かがもっと簡単な解決策を知っているのだろうかと思います。

これはかなりシンプルですが、動作の仕組みを正確に把握するのに少し時間がかかりました。

ありがとうございました。

% 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). % (*) 

答えて

1

このビルド対称木:

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取り扱いがなくなっているか、簡単な本当にです。

+0

ありがとうlarsmans。私はあなたが何を得ているのかを見ます。しかし、あなたが別の解を求めて、ツリー表記がt(x、L、R)ならば、それはハングします。ここで、xはルートノードです。それ以外はもっと簡単です。 – ale

+0

が編集されました。これは本当に素早いハックでした。 –

関連する問題