プログラミング > アルゴリズム > AVL木

AVL木について



概要

節(根)から見て左枝と右枝の深さの差が1以下になる
全ての節において上記条件が満たされるように調整する二分木
だと思われる(?)

要素の追加と削除は通常の二分探索木(?)と同じように行い
その後に条件を満たさない節に回転処理というものを行って調整する(らしい)

回転処理(画像)


回転処理(説明)

※これで正しいか知らん
●説明のための定義
根(あるいは節)を A
根(A)の左枝の節(あるいは葉)を B
根(A)の右枝の節を C
根(A)の左枝(B)の左枝の節(あるいは葉)を D
根(A)の左枝(B)の右枝の節を E
根(A)の右枝(C)の左枝の節を F
根(A)の右枝(C)の右枝の節を G
以下同様にH~Oまで名前付け
          A
    B           C
 D     E     F     G
H I   J K   L M   N O
★根(A)から見て右枝が深くなりすぎた場合
  • 右枝(C)の左枝(F)が右枝(C)の右枝(G)より長い場合(画像の上二つのパターン)
[1]枝(F)を根の位置に持ってくる
[2]枝(C)の左枝には枝(F)の右枝の先を付ける
[3]根(A)の右枝には枝(F)の左枝の先を付ける
[4]枝(F)の左枝には根(A)を付ける
[5]枝(F)の右枝には枝(C)を付ける
擬似コード
 001 root = F
 002 C.left = F.right
 003 A.right = F.left
 004 F.left = A
 005 F.right = C
  • 右枝(C)の右枝(G)が右枝(C)の左枝(F)より長い場合(画像の下二つのパターン)
[1]枝(C)を根の位置に持ってくる
[2]根(A)の右枝には枝(C)の左枝の先を付ける
[3]枝(C)の左枝には根(A)を付ける
擬似コード
 001 root = C
 002 A.right = C.left
 003 C.left = A
★根(A)から見て左枝が深くなりすぎた場合
根(A)から見て右枝が深くなりすぎた場合の左右逆を実施すればよい
最終更新:2015年02月06日 06:42
添付ファイル