AVL树的插入函数+CSDN去水印办法+04-树5 Root of AVL Tree (25 分)

在这里插入图片描述该
该图是把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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值