値の等しいノードを許さない、許す場合左右どちらに追加するかなどバリエーションがあります。
ここでは、2分探索木の検索・挿入・削除のアルゴリズムを紹介します。 走査については、2分木の走査を参照してください。 2分探索木を通りがかり順に歩くと、ノードの値を昇順に取り出すことができます。 2分探索木の順序を保持したまま、木のバランスを変えるローテーションについては、 木のローテーションを参照してください。
その他の関連項目
2分探索木についてはWebサイトでも数多く紹介されています。 木については WIKIPEDIA にかなり丁寧な解説があります。 2分探索木についても Binary search tree を参考にしました。
以下の解説では、 等しい要素を許すような2分探索木を扱います。 等しい要素は右部分木に挿入します。
実際のプログラムは J2SE 5.0 で作成してみました。 ノードの値をジェネリック(Comparable を実装した Object)にしましたので、 J2SE 1.4 ではコンパイル・エラーになります。 J2SE 1.4 用に Object に書き直してみました。 行数は変わりませんので、都合のよいほうを参照してください。
同じ名前ですが、別のプログラムですので注意してください。木のノードには、
を保持することにします。 (BinaryTree.java 11〜14 行目)
NIL は値が「ない」状態 (Null In List) を示す「もの」です。 Javaの null または定数で実装するのが普通ですが、 NIL を他の部分木で置き換える処理の記述が簡略になるように、 値が null であるようなノードを使います。 通常の NIL と振る舞いが異なるのは、 NIL どうしの比較をするといつも「等しくない」点です。
左図のような2分探索木と空木についての動作確認です。
JUniit については、
テスティングフレームワーク JUnit
を参考にしました。
テスト・プログラム BinaryTreeTester.java
コンパイルと実行
実行結果
Top Page
更新日:2005-10-15