AVL树

Posted lwyeah

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AVL树相关的知识,希望对你有一定的参考价值。

定义:每个节点的左右子树的高度最多差1的二叉查找树。(空树的高度为-1)。

AVL树保证树的高度只比log(N)多一点,因此除了插入删除外,可以保证所有的树操作都以O(logN)执行。

当插入一个节点的时候,只有那些从插入点到根节点路径上的点的平衡性可能被破坏,在最深的不满足平衡性的节点进行平衡操作,可以重新使整个树满足AVL特性。

主要操作:对不满足AVL特性的子树执行单旋转和双旋转操作,使得插入后的子树保持和插入前的子树相同的高度。

节点的基本定义:

 1 struct AvlNode;
 2 typedef struct AvlNode *Position;
 3 typedef struct AvlNode *AvlTree;
 4 
 5 struct AvlNode{
 6     ElementType Element;
 7     AvlTree Left;
 8     AvlTree Right;
 9     int Height;
10 };

单旋转(左-左  右-右)代码如下:

 1 Position SingleRotateWithLeft(AvlTree K2){
 2     Position K1;
 3     K1 = K2->Left;
 4     K2->Left = K1->Right;
 5     K1->Right = K2;
 6 
 7     K2->Height = max(Height(K2->Left), Height(K2->Right)) + 1;
 8     K1->Height = max(Height(K1->Left), K2->Height) + 1;
 9     return K1;
10 }
11 
12 Position SingleRotateWithRight(AvlTree K2){
13     Position K1;
14     K1 = K2->Right;
15     K2->Right = K1->Left;
16     K1->Left = K2;
17     
18     K2->Height = max(Height(K2->Left), Height(K2->Right)) + 1;
19     K1->Height = max(K2->Height, Height(K1->Right)) + 1;
20     return K1;
21 }

双旋转(左-右 右-左)代码如下:

1 Position DoubleRotateWithLeft(AvlTree K3){
2     K3->Left = SingleRotateWithRight(K3->Left);
3     return SingleRotateWithLeft(K3);
4 }
5 
6 Position DoubleRotateWithRight(AvlTree K3){
7     K3->Right = SingleRotateWithLeft(K3->Right);
8     return SingleRotateWithRight(K3);
9 }

 

插入算法如下:

 1 AvlTree Insert(ElementType X, AvlTree T){
 2     if(T == NULL){
 3         T = (AvlTree)malloc(sizeof(struct AvlNode));
 4         T->Height = 0;
 5         T->Left = T->Right = NULL;
 6         T->Element = X;
 7     }
 8     else if(X < T->Element){
 9         T->Left = Insert(X, T->Left);
10         if(Height(T->Left)-Height(T->Right) == 2){
11             if(X < T->Left->Element){
12                 T = SingleRotateWithLeft(T);
13             }
14             else{
15                 T = DoubleRotateWithLeft(T);
16             }
17         }
18     }
19     else if(X > T->Element){
20         T->Right = Insert(X, T->Right);
21         if(Height(T->Right)-Height(T->Left) == 2){
22             if(X > T->Right->Element){
23                 T = SingleRotateWithRight(T);
24             }
25             else{
26                 T = DoubleRotateWithRight(T);
27             }
28         }
29     }
30 
31     T->Height = max(Height(T->Left), Height(T->Right)) + 1;
32     return T;
33 }

 

以上是关于AVL树的主要内容,如果未能解决你的问题,请参考以下文章

C++AVL树的实现--详细解析旋转细节

[算法] 数据结构之AVL树

树:AVL树

徒手写的AVL竟然比STL中的红黑树效率更高?✨

AVL树

C++ AVL树