数据结构——AVL平衡树

1、是二叉搜索树(Binary Search Tree)

2、树和所有左右子树高度之差为-1,0,1

 

平衡因子(balance factor)

  =右子树高度-左子树高度

 

平衡化旋转:

  1、从插入位置向根节点计算节点的平衡因子;

  2、若发现不平衡点(即平衡因子绝对值大于1),从此节点向下取两层;

  3、若三节点在同一直线上,则左单旋或右单旋,中间为旋转中心;

  4、否则左右双旋或右左双旋,最下为旋转中心。

//形成左直线->右单旋(以B为旋转中心)

 

//ACF形成向右凸的非直线性->右左旋(以F为旋转中心)

 

 

单旋和双旋完整代码(包含平衡因子):

  1         int depth(AVLnode *p)
  2         {
  3             int ldep=0,rdep=0,depval;
  4             if(p==NULL)
  5                 depval=-1;
  6             else
  7             {
  8                 ldep=depth(p->left);
  9                 rdep=depth(p->right);
 10                 depval=1+(ldep>rdep?ldep:rdep);
 11             }
 12             return depval;
 13         };
 14 
 15         int balanceFactor(AVLnode *cur)
 16         {
 17             int ldep=0,rdep=0;
 18             AVLnode *p=cur;
 19             ldep=depth(p->left);
 20             rdep=depth(p->right);
 21             return (rdep-ldep);    
 22         };
 23 
 24         void rightRotate(AVLnode *cur)
 25         {
 26             //cur is the middle one
 27             if(cur->right!=NULL)
 28             {
 29                 cur->parent->left=cur->right;
 30                 cur->right->parent=cur->parent;
 31             }
 32             else cur->parent->left=NULL;
 33 
 34             if(cur->parent->parent==NULL)
 35             {
 36                 cur->parent->parent=cur;
 37                 cur->right=cur->parent;
 38                 cur->parent=NULL;
 39                 root=cur;
 40             }
 41             else 
 42             {
 43                 AVLnode *pr=cur->parent->parent;
 44                 cur->right=cur->parent;
 45                 cur->parent->parent=cur;
 46 
 47                 cur->parent=pr;
 48                 if(cur->nodeValue>pr->nodeValue)
 49                     pr->right=cur;
 50                 else pr->left=cur;
 51             }
 52         };
 53 
 54         void leftRotate(AVLnode *cur)
 55         {
 56             //cur is the middle one
 57             if(cur->left!=NULL)
 58             {
 59                 cur->parent->right=cur->left;
 60                 cur->left->parent=cur->parent;
 61             }
 62             else cur->parent->right=NULL;
 63 
 64             if(cur->parent->parent==NULL)
 65             {
 66                 cur->parent->parent=cur;
 67                 cur->left=cur->parent;
 68                 cur->parent=NULL;
 69                 root=cur;
 70             }
 71             else 
 72             {
 73                 AVLnode *pr=cur->parent->parent;
 74                 cur->left=cur->parent;
 75                 cur->parent->parent=cur;
 76 
 77                 cur->parent=pr;
 78                 if(cur->nodeValue>pr->nodeValue)
 79                     pr->right=cur;
 80                 else pr->left=cur;
 81             }
 82         };
 83 
 84         void leftrightRotate(AVLnode *cur)
 85         {
 86             //cur is the third one
 87             //全空
 88             if(cur->left==NULL&&cur->right==NULL)
 89             {
 90                 cur->parent->right=NULL;
 91                 cur->parent->parent->left=NULL;
 92             }
 93             //一边空 另一边最多一个
 94             else if(cur->right==NULL)
 95             {
 96                 cur->left->parent=cur->parent;
 97                 cur->parent->right=cur->left;
 98                 cur->parent->parent->left=NULL;
 99             }
100             else if(cur->left==NULL)
101             {
102                 cur->right->parent=cur->parent->parent;
103                 cur->parent->parent->left=cur->right;
104                 cur->parent->right=NULL;
105             }
106             //非空 挂在一边 另一边最多只有一个元素
107             else
108             {
109                 cur->left->parent=cur->parent;
110                 cur->parent->right=cur->left;
111 
112                 cur->right->parent=cur->parent->parent;
113                 cur->parent->parent->left=cur->right;
114         
115             }
116             AVLnode *pr=cur->parent->parent->parent;
117 
118             cur->right=cur->parent->parent;
119             cur->parent->parent->parent=cur;
120                 
121             cur->parent->parent=cur;
122             cur->left=cur->parent;
123 
124             if(pr!=NULL)
125             {
126                 cur->parent=pr;
127                 if(cur->nodeValue<pr->nodeValue)
128                     pr->left=cur;
129                 else pr->right=cur;
130             }
131             else
132             {                
133                 cur->parent=NULL;
134                 root=cur;
135             }
136         };
137 
138         void rightleftRotate(AVLnode *cur)
139         {
140             //cur is the third one
141             //全空
142             if(cur->left==NULL&&cur->right==NULL)
143             {
144                 cur->parent->left=NULL;
145                 cur->parent->parent->right=NULL;
146             }
147             //一边空 另一边最多一个
148             else if(cur->left==NULL)
149             {
150                 cur->right->parent=cur->parent;
151                 cur->parent->left=cur->right;
152                 cur->parent->parent->right=NULL;
153             }
154             else if(cur->right==NULL)
155             {
156                 cur->left->parent=cur->parent->parent;
157                 cur->parent->parent->right=cur->left;
158                 cur->parent->left=NULL;
159             }
160             //非空 挂在一边 另一边最多只有一个元素
161             else
162             {
163                 cur->right->parent=cur->parent;
164                 cur->parent->left=cur->right;
165 
166                 cur->left->parent=cur->parent->parent;
167                 cur->parent->parent->right=cur->left;
168         
169             }
170             AVLnode *pr=cur->parent->parent->parent;
171 
172             cur->left=cur->parent->parent;
173             cur->parent->parent->parent=cur;
174                 
175             cur->parent->parent=cur;
176             cur->right=cur->parent;
177 
178             if(pr!=NULL)
179             {
180                 cur->parent=pr;
181                 if(cur->nodeValue<pr->nodeValue)
182                     pr->left=cur;
183                 else pr->right=cur;
184             }
185             else
186             {                
187                 cur->parent=NULL;
188                 root=cur;
189             }
190         }
View Code

 

平衡插入完整代码:

 1 AVLnode *AVLtree::insert(const string &item)
 2 {
 3     AVLnode *t=root,*newnode,*parent=NULL;
 4     while(t!=NULL)
 5     {
 6         parent=t;
 7         if(item==t->nodeValue)
 8             return NULL;
 9         else if(item<t->nodeValue)
10             t=t->left;
11         else
12             t=t->right;
13     }
14     newnode=creatAVLNode(item,NULL,NULL,parent);
15     if(parent==NULL) 
16         root=newnode;
17     else if(item>parent->nodeValue)
18         parent->right=newnode;
19     else 
20         parent->left=newnode;
21         treeSize++;
22 
23     int bf=0,count=0;
24     AVLnode *cur=newnode,*p=newnode;
25     while(bf>=-1&&bf<=1&&cur!=root)
26     {
27         cur=cur->parent;
28         count++;
29         bf=balanceFactor(cur);
30     }
31 
32     if(bf<-1||bf>1)
33     {
34         if(count==2) ;
35         else
36         {
37             for(int i=0;i<count-2;i++)
38                 p=p->parent;
39         }
40         //all left
41         if(p->nodeValue<p->parent->nodeValue&&p->parent->nodeValue<cur->nodeValue)
42             rightRotate(p->parent);
43         
44         //all right
45         else if(p->nodeValue>p->parent->nodeValue&&p->parent->nodeValue>cur->nodeValue)
46             leftRotate(p->parent);
47         
48         //right left
49         else if(p->nodeValue<p->parent->nodeValue&&p->parent->nodeValue>cur->nodeValue)
50             rightleftRotate(p);
51         //left right 
52         else if(p->nodeValue>p->parent->nodeValue&&p->parent->nodeValue<cur->nodeValue)
53             leftrightRotate(p);
54     }
55     return newnode;
56 }
View Code

 

平衡删除完整代码:

待补充

 

posted @ 2015-01-04 00:09  verlen  阅读(214)  评论(0编辑  收藏  举报