2011-01-22 7 views
2

バイナリツリーが完全なバイナリツリーであるかどうかをチェックするアルゴリズムとは何ですか? (Prologを使用して)。例えばPrologを使用して完全なバイナリツリー述語を書く方法

?- complete(nil). 
true. 

?- complete(tree(1,nil,nil)). 
true. 

?- complete(tree(1,tree(2,nil,nil),nil)). 
false. 

?- complete(tree(1,tree(2,nil,nil),tree(3,nil,nil))). 
true. 
+0

スタートのために、英語でのアルゴリズムは何ですか? –

+0

さて、すべての葉が根から同じ距離にある必要があります。だから、最も単純なアルゴリズムは、すべてを通過し、すべてがルートから同じ距離を持っているかどうかをチェックします。 – user550413

+0

おそらく少し速いアプローチ:1枚の葉の深さを見つけてから、奥行きがより小さい葉ノードまたは等しい深さを有する葉でないノードを探す。どちらかが見つかった場合、バイナリツリーは「完全」ではありません。 – hardmath

答えて

2
complete(T) :- complete(T, _). 

complete(nil, 0). 
complete(tree(_, L, R), N) :- 
    complete(L, N1), 
    complete(R, N1), 
    N is N1 + 1. 

更新

それは私の作品:

?- complete(nil). 
true. 

?- complete(tree(1,nil,nil)). 
true. 

?- complete(tree(1,tree(2,nil,nil),nil)). 
false. 

?- complete(tree(1,tree(2,nil,nil),tree(3,nil,nil))). 
true. 
+0

動作しません。私が上に示したすべての例について真を返します。あなたがしようとしていることを理解していれば、右のサブツリーと左のサブツリーが完全なバイナリツリーを定義していない同じ高さを持つことを確認することです。 – user550413

+0

@ user550413:実際に試しましたか?少なくともあなたのポストのサンプルについては、私と一緒に働くからです! – salva

関連する問題