整列2分木:ヒープ(heap)
- 整列2分木(heap)とは、以下の条件を満たすラベル付き木である:
- 完全2分木である。
但し最下段(レベル0)だけは例外で、左から順に詰まっていれば、頂点(ノード)が存在しなくても良い。
レベル1の頂点の内、子が1個のものは高々1個で、あれば左の子だけを持つ。
- 各頂点が「頂点のラベルは何れの子のラベルよりも小さくない」というヒープ条件(heap condition)を満たしている。
ヒープ(heap)に対する操作
挿入(Insert)
- 新たなノードをヒープの最後に追加する
- そこから上(ルート)に向かって所定の位置まで移動する(⇒図)
↑この操作をふるい上げ(sift-up)と呼ぶ
ルートの削除(Delete)
- ルートのノードを削除する
- ヒープの最後のノードをルートに移動する
- そこから下(リーフ)に向かって所定の位置まで移動する(⇒図)
↑この操作をふるい下げ(sift-down)と呼ぶ
削除(Delete)
- 指定されたノードを削除する(それがヒープの最後のノードだったなら、これで終り)
- ヒープの最後のノードをそこに移動する
- 削除したノードより大きい(or小さい)場合は、ふるい上げ(orふるい下げ)を行う
整列2分木:ヒープ(heap)の配列を使った実現
- このように頂点に通し番号を付けると、頂点kの左右の子の番号はそれぞれ2k、2k+1で表され、頂点nの親の番号はn/2(切捨)で表される
- 頂点の番号をインデックスとみなして、ラベルデータを配列に格納することができる(Cの配列のインデックスとは異なり1から始まるものとする→C版)
整列2分木:ヒープ(heap)の配列を使った実現(in C)
- このように頂点に通し番号を付けると、頂点kの左右の子の番号はそれぞれ2k+1、2k+2で表され、頂点nの親の番号は(n−1)/2(切捨)で表される
- 頂点の番号をインデックスとみなして、ラベルデータを配列に格納することができる