まず、二分木が定義される:度(すべてのサブツリーの各ノードの最大値)は2の数です。
第二に、バイナリツリーの性質:
1.バイナリツリー第i層上の最大2 ^(I - 1)番目のノード。
2. Kの深さにバイナリツリー最大2 ^ K - 1番目のノード。
2-1およびK 2の深さを有しているが、^ K -二分木の1つのノードが呼び出され、完全なバイナリツリー。
2-2編集された番号(1〜2 ^ K - 1で左から右にトップダウン、より完全なバイナリツリーの各ノード )。場合にのみ、ノードは、深さK-1に対応(すなわち、最後の層の最後から二番目のノード度がないの完全なバイナリツリーに関連付けられているそれぞれが場合はkの深さは、ノードがバイナリツリーにn個存在する2 、不足している完全なバイナリツリーのノードに対してのみ最後の、そして最後の一つは左連続の右端から削除ノードである)、ツリーが呼び出され、完全二分木。
ノード2 1の複数のノードの数の特定の割合を残す任意のバイナリツリー、3.。すなわち:N- 0 = N 2 + 1。 ;
図4は有するn型頂点の完全なバイナリツリーの深フロア(ログ2。n)を+ 1(フロア丸め下向き)。
N-ノードバイナリツリー5.は、任意のノード(数I)のために、以下のとおりです。
5-1 I = 1の場合、ノードは、ルートノード、親ノード番号または床(I / 2)(プログラム内のI / 2に直接書き込むことができる)です。
5-2 2 I> nで、このノードに子がない*場合は、ルートである;、これが唯一の左の子ノードである2 * I == n個あれば、その数は2 * iは、そうでない場合は、このノードが持っています左の子と右の子、第2 * iと2 * I + 1でした。
第三に、バイナリツリーストレージ:ストレージ構造:
1つの 構造体ノード 2 { 3。 DATA_TYPEデータ; // データ 。4 ノード* leftChild、rightChild; // 左の子および右側の子 5 }; 6ノード* BT; // ルート
IV:バイナリツリートラバーサル(バイナリツリートラバーサル操作の各が空ではありません)
1.プレオーダー:ルート・ノードに(1)アクセス、(2)予約限定左サブツリー;(3)プレオーダー右サブツリー(ルート - >左 - >右)
2.トラバース配列:( - >ルート - >右から左)、(3)予約限定右サブツリー;ルートノード(2)アクセス(1)サブツリートラバーサル順序を残し
3.後順:(1)後順にサブツリーを左;(2)右サブツリー先行予約、ルートノードへの(3)アクセス(左 - >右 - >ルート)
ボイドプレ(ノード* BT)// プレオーダー { IF (BT) { COUT << BT-> データ; プレ(BT - > leftChild); プレ(BT - > rightChild); } } ボイド における(ノード* BT )// トラバーサルシーケンス { IF (BT) { に(BT-> leftChild); COUT << BT-> データ; で(BT-> rightChild); } } ボイドポスト(ノード* BT)// 後順トラバーサル { もし(BT) { ポスト(BT - > leftChild)。 ポスト(BT - > rightChild); coutの << BT-> データ; } }