1 //平衡二叉树
2 #include<iostream>
3 using namespace std;
4
5 typedef struct BiTNode
6 {
7 int data;
8 int BF;
9 BiTNode *lchild, *rchild;
10 }*BiTree;
11
12 // 对以p为根的二叉排序树作右旋处理,
13 // 处理之后p指向新的树根结点,即旋转处理之前的左子树的根结点
14 void R_Rotate(BiTree *p)
15 {
16 BiTree L;
17 L = (*p)->lchild;
18 (*p)->lchild = L->rchild; //L的右子树挂接为P的左子树
19 L->rchild = *p;
20 *p = L;
21 }
22
23 // 对以p为根的二叉排序树作左旋处理,
24 // 处理之后p指向新的树根结点,即旋转处理之前的右子树的根结点
25 void L_Rotate(BiTree *p)
26 {
27 BiTree R;
28 R = (*p)->rchild;
29 (*p)->rchild = R->lchild;//R的左子树挂接为P的右子树
30 R->lchild = *p;
31 *p = R;
32 }
33
34 // 对以指针T所指结点为根的二叉树作左平衡旋转处理
35 // 本算法结束时,指针T指向新的根结点
36 void LeftBalance(BiTree *T)
37 {
38 BiTree L, Lr;
39 L = (*T)->lchild;
40 switch(L->BF)
41 {
42 case 1: //新结点插在T的左孩子的左子树上,要作单右旋处理
43 (*T)->BF = L->BF = 0;
44 R_Rotate(T);
45 break;
46 case -1: //新结点插入在T的左孩子的右子树上,要作双旋处理
47 Lr = L->rchild;
48 switch(Lr->BF)
49 {
50 case 1:
51 (*T)->BF = -1;
52 L->BF = 0;
53 break;
54 case 0:
55 (*T)->BF = 0;
56 L->BF = 0;
57 break;
58 case -1:
59 (*T)->BF = 0;
60 L->BF = 1;
61 break;
62 }
63 Lr->BF = 0;
64 L_Rotate(&(*T)->lchild);
65 R_Rotate(T);
66 }
67 }
68
69 // 对以指针T所指结点为根的二叉树作右平衡旋转处理,
70 // 本算法结束时,指针T指向新的根结点
71 void RightBalance(BiTree *T)
72 {
73 BiTree R, Rl;
74 R = (*T)->rchild;
75 switch(R->BF)
76 {
77 case -1: //新结点插入在T的右孩子的右子树上,要作单左旋处理
78 (*T)->BF = R->BF =0;
79 L_Rotate(T);
80 break;
81 case 1: //新结点插入在T的右孩子的左子树上,要作双旋处理
82 Rl = R->lchild;
83 switch(Rl->BF)
84 {
85 case 1:
86 (*T)->BF = 0;
87 R->BF = -1;
88 break;
89 case 0:
90 (*T)->BF = 0;
91 R->BF = 0;
92 break;
93 case -1:
94 (*T)->BF = 1;
95 R->BF = 0;
96 break;
97 }
98 Rl->BF = 0;
99 R_Rotate(&(*T)->rchild);
100 L_Rotate(T);
101 }
102 }
103
104 // 若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个
105 // 数据元素为e的新结点,并返回1,否则返回0。若因插入而使二叉排序树
106 // 失去平衡,则作平衡旋转处理,布尔变量taller反映T长高与否。
107 bool InsertAVL(BiTree *T, int e, bool *taller)
108 {
109 if(!*T) //插入新的结点
110 {
111 *T = new BiTNode;
112 (*T)->data = e;
113 (*T)->lchild = (*T)->rchild = NULL;
114 (*T)->BF = 0;
115 *taller = true; //树长高
116 }
117 else
118 {
119 if(e == (*T)->data) //树中存在则不再插入
120 {
121 *taller = false;
122 return false;
123 }
124 if(e < (*T)->data) //在T的左子树中进行搜索
125 {
126 if(!InsertAVL(&(*T)->lchild,e,taller))
127 return false;
128 if(*taller)
129 {
130 switch((*T)->BF)
131 {
132 case 1: //原本左子树比右子树高
133 LeftBalance(T);
134 *taller = false;
135 break;
136 case 0: //原本左右子树等高
137 (*T)->BF = 1;
138 *taller = true;
139 break;
140 case -1: //原本左子树比右子树低
141 (*T)->BF = 0;
142 *taller = false;
143 break;
144 }
145 }
146 }
147 else
148 {
149 if(!InsertAVL(&(*T)->rchild,e,taller))
150 return false;
151 if(*taller)
152 {
153 switch((*T)->BF)
154 {
155 case 1:
156 (*T)->BF = 0;
157 *taller = false;
158 break;
159 case 0:
160 (*T)->BF = -1;
161 *taller = true;
162 break;
163 case -1:
164 RightBalance(T);
165 *taller = false;
166 break;
167 }
168 }
169 }
170 }
171 return true;
172 }
173
174 void PreOrderPrint(BiTree T)
175 {
176 if(T==NULL)
177 return;
178 cout<<T->data<<" ";
179 PreOrderPrint(T->lchild);
180 PreOrderPrint(T->rchild);
181 }
182
183 int main()
184 {
185 int a[10] = {3,2,1,4,5,6,7,10,9,8};
186 BiTree T = NULL;
187 bool taller;
188 for(int i=0;i<10;i++)
189 {
190 InsertAVL(&T,a[i],&taller);
191 }
192 PreOrderPrint(T);
193
194 return 0;
195 }