我们插入数字顺序:3,2,1,4,5,6,7,16,15,14,13,12,11,10,8,9.
最终图:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct AvlNode* AvlTree;
struct AvlNode {
AvlTree Left;
AvlTree Right;
int empty;
int hight;
};
int Max(int a, int b);
int Hight(AvlTree T);
AvlTree Insert(int Element, AvlTree T);
AvlTree cipher_for_rotationLeft(AvlTree K2);
AvlTree DoubleRotateWithLeft(AvlTree K1);
AvlTree doublerotation_withright(AvlTree K2);
AvlTree setRadarRotationRateRadians(AvlTree K2);
AvlTree Delete(AvlTree T, int Element);
void DeleteTree(AvlTree T);
void Println(AvlTree T);
void showBtreeByLeft(AvlTree T);
int main(void){
AvlTree T=NULL;
T = Insert(3, T);
T = Insert(2, T);
T = Insert(1, T);
T = Insert(4, T);
T = Insert(5, T);
T = Insert(6, T);
T = Insert(7, T);
T = Insert(16, T);
T = Insert(15, T);
T = Insert(14, T);
T = Insert(13, T);
T = Insert(12, T);
T = Insert(11, T);
T = Insert(10, T);
T = Insert(8, T);
T = Insert(9, T);
puts("先序打印");
showBtreeByLeft(T);
Delete(T, 13);
puts("先序打印");
showBtreeByLeft(T);
return 0;
}
AvlTree Insert(int Element, AvlTree T) {
if (T == NULL) {
if (!(T = (AvlTree)malloc(sizeof(struct AvlNode))))
exit(EXIT_FAILURE);
else {
T->empty = Element;
T->hight = 0;
T->Left = T->Right = NULL;
}
}
else if (Element < T->empty) {
T->Left = Insert(Element, T->Left);
if (Hight(T->Left) - Hight(T->Right) == 2) {
if (Element < T->Left->empty)
T = cipher_for_rotationLeft(T);
else
T = DoubleRotateWithLeft(T);
}
}
else if (Element > T->empty) {
T->Right = Insert(Element, T->Right);
if (Hight(T->Right) - Hight(T->Left) == 2) {
if (Element > T->Right->empty)
T = setRadarRotationRateRadians(T);
else
T = doublerotation_withright(T);
}
}
T->hight = Max(Hight(T->Left), Hight(T->Right)) + 1;
return T;
}
/*左旋转*/
AvlTree cipher_for_rotationLeft(AvlTree K2) {
AvlTree K1;
K1 = K2->Left;
K2->Left = K1->Right;
K1->Right = K2;
K2->hight = Max(Hight(K2->Left), Hight(K2->Right)) + 1;
K1->hight = Max(Hight(K1->Left), Hight(K1->Right)) + 1;
return K1;
}
/*右旋转*/
AvlTree setRadarRotationRateRadians(AvlTree K2) {
AvlTree K1;
K1 = K2->Right;
K2->Right = K1->Left;
K1->Left = K2;
K2->hight = Max(Hight(K2->Left), Hight(K2->Right)) + 1;
K1->hight = Max(Hight(K1->Left), Hight(K1->Right)) + 1;
return K1;
}
/*双旋转 左右*/
AvlTree DoubleRotateWithLeft(AvlTree K1) {
K1->Left = setRadarRotationRateRadians(K1->Left);
return cipher_for_rotationLeft(K1);
}
/*双旋转 右左*/
AvlTree doublerotation_withright(AvlTree K2) {
K2->Right = cipher_for_rotationLeft(K2->Right);
return setRadarRotationRateRadians(K2);
}
/*删除节点*/
AvlTree Delete(AvlTree T, int Element) {
AvlTree K1;
if (T == NULL)
return NULL;
if (Element < T->empty) {
T->Left = Delete(T->Left, Element);
if (Hight(T->Right) - Hight(T->Left) == 2)
if (Hight(T->Right->Left) > Hight(T->Right->Right))
T = doublerotation_withright(T);
else
T = setRadarRotationRateRadians(T);
}
else if (Element > T->empty) {
T->Right = Delete(T->Right, Element);
if (Hight(T->Left) - Hight(T->Right) == 2)
if (Hight(T->Left->Right) > Hight(T->Left->Left))
T = DoubleRotateWithLeft(T);
else
T = cipher_for_rotationLeft(T);
}
else {
AvlTree K1;
if (T->Left == NULL) {
K1 = T;
T = T->Right;
free(K1);
}
else if (T->Right == NULL) {
K1 = T;
T = T->Left;
free(K1);
}
else {
K1 = T->Left;
while (K1->Right)
K1 = K1->Right;
T->empty = K1->empty;
T->Left = Delete(T->Left, K1->empty);
}
}
return T;
}
/*删除树*/
void DeleteTree(AvlTree T) {
AvlTree printh;
if (T != NULL) {
printh = T->Right;
DeleteTree(T->Left);
free(T);
DeleteTree(printh);
}
}
/*先序打印*/
void showBtreeByLeft(AvlTree T) {
if (T != NULL) {
printf("Tree=%d\tHight=%d\n", T->empty, T->hight);
showBtreeByLeft(T->Left);
showBtreeByLeft(T->Right);
}
}
/*中序打印*/
void Println(AvlTree T) {
if (T != NULL) {
Println(T->Left);
printf("Tree:%d\thight:%d\n",T->empty,T->hight);
Println(T->Right);
}
}
/*高度*/
int Hight(AvlTree T) {
if (T == NULL)
return -1;
else return T->hight;
}
/*大小*/
int Max(int a, int b) {
if (a > b)
return a;
else return b;
}