データ構造 - AVL木

AVL木

  • AVL木はです均衡条件バランスの取れたバイナリツリー
  • 均衡条件:各ノードのその左部分木の高さは、右のサブツリー
  • これはAVL木であります
    ここに画像を挿入説明
  • これは、のAVL木ではありません
    ここに画像を挿入説明

挿入ノードAVL木の損傷の平衡条件を解決した後

  • によって回転ノードAVL木のバランスを変更する方法。
  • 私たちは、この不均衡は、次の4つの中で発生する可能性がありますことを確認するために2つのサブツリーに簡単に点2を、必要となるノードを任意のノードのために、非常にアンバランスな高さの差が生じ、ほとんどの2人の息子であり呼ばれるリバランスする必要があります例:
  • 挿入したら1、左の部分木は彼の息子を残して - (左 - 左)
  • 挿入されると図2に示すように、左及び息子の右サブツリー - (左 - 右)
  • 挿入したら3、息子のサブツリー左右 - (右 - 左)
  • 図4に示すように、挿入された右の部分木の一対の右息子一度 - (右 - R)
1と4は、そのため私たちは、この問題を解決し、新しいAVLツリーを達成するために、私たちのダブルロータリーで2と3のために、単一の回転を使用します

一回転

6後のノードにAVLツリー全体のノードは、ノード8で、バランスを破壊しました。ここでは8です。ここでは(左 - 左)属し、我々は8ノードK1、K2は、ノード7のように定義された通り、今解決するK1、K2の位置を置くことになる定義します。
ここに画像を挿入説明
ここに画像を挿入説明

  • 同様にシナリオ4と同様の理由であります
  • 概要:我々は、ノードの次のノードがK2に設定され、ノードK1を設定します、K1、新しいAVL木の形成上のノードのk2の再配置位置にポストした後、少し知識があるのですノード値がK1およびK2はないとの間に挿入されたとき、それは、単一の回転に溶液ながら、ケース1とケース4となります。

ダブル回転

  • ここではシナリオ2と3を解決するための(すなわち、左 - 右および右 - 左)。デュアルは、実際には2つの単一の回転をロータリー
  • ここで(7)点K2以下の点K3、K3以下K1、K1に設定されています。位置aにノードK2、他のノードが再配置しました。二重回転ノードの所望の値が得られます確かk1とk3の間
    ここに画像を挿入説明
  • ここでk1,16 7 k2がk3,15ですです。
  • 解決するには、上記の手順に従ってください、これは右である - 左、共感は左 - 右は同じです。
    ここに画像を挿入説明

実装コード

AVLツリーデータ構造
  • これは内部クラスです
public static class AvlNode<T>{
    
    AvlNode node;
    AvlNode<T> rnode;
    AvlNode<T> lnode;
    Integer height;
    AvlNode(AvlNode node){
        this(node,null,null);
    }
    AvlNode(AvlNode node,AvlNode<T> lnode,AvlNode<T> rnode){
        this.node = node;
        this.rnode = rnode;
        this.lnode = lnode;
    }
}
一回転
  • 交換ノード上に配置され、着信ノードに対応する左側の部分があります。
 private AvlNode<T> rotateWithLeftChild(AvlNode<T> k2){
   AvlNode<T> k1 = k2.lnode;
   k2.lnode = k1.rnode;
   k1.rnode = k2;
   k2.height = Math.max(height(k2.lnode),height(k2.rnode))+1;
   k1.height = Math.max(height(k1.lnode),height(k1.rnode))+1;
   return k1;
}
  • 同様に、右回転
private AvlNode<T> rotateWithRightChild(AvlNode<T> k2){
   AvlNode<t> k1 = k2.rnode;
   k2.rnode = k1.lnode;
   k1.lnode = k2;
   k2.height = Math.max(height(k2.lnode),height(k2.rnode))+1;
   k1.height = Math.max(height(k1.lnode),height(k1.rnode))+1;
   return k1;
}
高さを計算します
public Integer height(AvlNode<T> t ){
   return t == null?-1:t.height;
}
ダブル回転
private AvlNode<T> doubleWithLeftChild(AvlNode<T> k3){
   k3.lnode = rotateWithRightChild(k3.lnode);
   return rotateWithLeftChild(k3);
}
private AvlNode<T> doubleWithRightChild(AvlNode<T> k3){
   k3.lnode = rotateWithLeftChild(k3.lnode);
    return rotateWithRightChild(k3)
}
公開された134元の記事 ウォン称賛91 ビュー160 000 +

おすすめ

転載: blog.csdn.net/weixin_44588495/article/details/102773661