该图是把i=0,1,2,3,4依次插入空树所形成的AVL树,前序遍历结果是1 0 3 2 4。
//AVL树的插入函数
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct AVLNode *Position;
typedef Position AVLTree;
struct AVLNode{
ElementType Data;
AVLTree Left;
AVLTree Right;
int Height;
};
int Max(int a,int b);
AVLTree SingleLeftRotation(AVLTree A);
AVLTree SingleRightRotation(AVLTree A);
AVLTree DoubleLeftRightRotation(AVLTree A);
AVLTree DoubleRightLeftRotation(AVLTree A);
AVLTree Insert(AVLTree T,ElementType X);
void PreorderTraversal(AVLTree T);
int GetHeight(AVLTree T)
{
if(!T) return 0;
int LH,RH;
LH=GetHeight(T->Left);
RH=GetHeight(T->Right);
return Max(LH,RH)+1;
}
int main()
{
AVLTree T=NULL;
for(int i=0;i<5;i++){
T=Insert(T,i);
}
printf("手算的前序遍历为:1 0 3 2 4\n");
printf("测试Insert函数,前序输出为:");
PreorderTraversal(T);
return 0;
}
int Max(int a,int b)
{
return a>b?a:b;
}
AVLTree SingleLeftRotation(AVLTree A)
{
//注意,A必须有一个左子结点B
//将A与B做左单旋,更新A与B的高度,返回新的跟结点B
AVLTree B=A->Left;
A->Left=B->Right;
B->Right=A;
A->Height=Max(GetHeight(A->Left),GetHeight(A->Right))+1;
B->Height=Max(GetHeight(B->Left),GetHeight(B->Right))+1;
return B;
}
AVLTree SingleRightRotation(AVLTree A)
{
AVLTree B=A->Right;
A->Right=B->Left;
B->Left=A;
A->Height=Max(GetHeight(A->Left),GetHeight(A->Right))+1;
B->Height=Max(GetHeight(B->Left),GetHeight(B->Right))+1;
return B;
}
AVLTree DoubleLeftRightRotation(AVLTree A)
{/* 注意:A必须有一个左子结点B,且B必须有一个右子结点C */
/* 将A、B与C做两次单旋,返回新的根结点C */
A->Left=SingleRightRotation(A->Left);
return SingleLeftRotation(A);
}
AVLTree DoubleRightLeftRotation(AVLTree A)
{
A->Right=SingleLeftRotation(A->Right);
return SingleRightRotation(A);
}
AVLTree Insert(AVLTree T,ElementType X)
{
if(!T){
T=(AVLTree)malloc(sizeof(struct AVLNode));
T->Data=X;
T->Height=1;
T->Left=T->Right=NULL;
}else if(X<T->Data){
T->Left=Insert(T->Left,X);
if(GetHeight(T->Left)-GetHeight(T->Right)==2)
if(X<T->Left->Data) T=SingleLeftRotation(T);
else T=DoubleLeftRightRotation(T);
}else if(X>T->Data){
T->Right=Insert(T->Right,X);
if(GetHeight(T->Left)-GetHeight(T->Right)==-2)
if(X>T->Right->Data) return T=SingleRightRotation(T);
else T=DoubleRightLeftRotation(T);
}
else return T;//X=T->Data无需插入
T->Height=Max(GetHeight(T->Left),GetHeight(T->Right))+1;
return T;
}
void PreorderTraversal(AVLTree T)
{
if(T){
printf("%d ",T->Data);
PreorderTraversal(T->Left);
PreorderTraversal(T->Right);
}
}
CSDN去水印办法:将下图中的照片文件名20210406110623158.png与#pic_center中间的代码全部删掉即可!
![在这里插入图片描述该](https://img-blog.csdnimg.cn/20210406110623158.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG
9nLmNzZG4ubmV0L3FxXzQxMDI1NzY5,size_16,color_FFFFFF,t_70#pic_center)
改为
![在这里插入图片描述该](https://img-blog.csdnimg.cn/20210406110623158.png#pic
_center)
惨痛:注意三目运算符的结果+1,要添加括号!!!!左、右单旋,高度别忘。Insert函数中根结点高度别忘修改!
//04-树5 Root of AVL Tree (25 分)
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct AVLNode *AVLTree;
typedef AVLTree Position;
struct AVLNode{
ElementType Data;
Position Left;
Position Right;
int Height;
};
int Max(int a,int b)
{
return a>b?a:b;
}
int GetHeight(AVLTree T)
{
int HL,HR;
if(T){
HL=GetHeight(T->Left);
HR=GetHeight(T->Right);
return (HL>HR?HL:HR)+1;//注意三目运算符的结果+1,要添加括号!!!!
}
else return 0;
}
AVLTree SingleLeftRotation(AVLTree A)
{
AVLTree B=A->Left;
A->Left=B->Right;
B->Right=A;
A->Height=Max(GetHeight(A->Left),GetHeight(A->Right))+1;
B->Height=Max(GetHeight(B->Left),GetHeight(B->Right))+1;
return B;
}
AVLTree SingleRightRotation(AVLTree A)
{
AVLTree B=A->Right;
A->Right=B->Left;
B->Left=A;
A->Height=Max(GetHeight(A->Left),GetHeight(A->Right))+1;
B->Height=Max(GetHeight(B->Left),GetHeight(B->Right))+1;
return B;
}
AVLTree DoubleLeftRightRotation(AVLTree A)
{
A->Left=SingleRightRotation(A->Left);
A=SingleLeftRotation(A);
return A;
}
AVLTree DoubleRightLeftRotation(AVLTree A)
{
A->Right=SingleLeftRotation(A->Right);
A=SingleRightRotation(A);
return A;
}
AVLTree Insert(AVLTree T,ElementType X)
{
if(!T){
T=(AVLTree)malloc(sizeof(struct AVLNode));
T->Data=X;
T->Left=T->Right=NULL;
T->Height=1;
return T;
}
if(X>T->Data){
T->Right=Insert(T->Right,X);
if(GetHeight(T->Left)-GetHeight(T->Right)==-2){
if(X>T->Right->Data)
T=SingleRightRotation(T);
else
T=DoubleRightLeftRotation(T);
}
}
else if(X<T->Data){
T->Left=Insert(T->Left,X);
if(GetHeight(T->Left)-GetHeight(T->Right)==2){
if(X>T->Left->Data)
T=DoubleLeftRightRotation(T);
else
T=SingleLeftRotation(T);
}
}
T->Height=Max(GetHeight(T->Left),GetHeight(T->Right))+1;
return T;
}
int main()
{
int N,Data;
AVLTree T=NULL;
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%d",&Data);
T=Insert(T,Data);
}
printf("%d",T->Data);
return 0;
}