平衡二叉树的根 (25 分)

将给定的一系列数字插入初始为空的AVL树,请你输出最后生成的AVL树的根结点的值。

输入格式:

输入的第一行给出一个正整数N(≤20),随后一行给出N个不同的整数,其间以空格分隔。

输出格式:

在一行中输出顺序插入上述整数到一棵初始为空的AVL树后,该树的根结点的值。

输入样例1:

5
88 70 61 96 120

输出样例1:

70

输入样例2:

7
88 70 61 96 120 90 65

输出样例2:

88

代码实现

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

typedef int ElementType;
typedef struct AVLNode* Position;
typedef Position AVLTree;
typedef struct AVLNode{
	ElementType Data;
	AVLTree Left;
	AVLTree Right;
};
//计算树高
int GetHeight(AVLTree A){
	int HL,HR,MaxH;
	if(A==NULL)
		return 0;
	else{
		HL=GetHeight(A->Left);
		HR=GetHeight(A->Right);
		MaxH=max(HL,HR);
		return (MaxH+1); 
	}
}
//左单旋(顺时针)
AVLTree SingleLeftRotation(AVLTree A){
	AVLTree B=A->Left;
	A->Left=B->Right;
	B->Right=A;
	return B;
}
//右单旋(逆时针)
AVLTree SingleRightRotation(AVLTree A){
	AVLTree B=A->Right;
	A->Right=B->Left;
	B->Left=A;
	return B;
}
//左-右双旋
AVLTree DoubleLeftRightRotation(AVLTree A){
	A->Left=SingleRightRotation(A->Left);
	return SingleLeftRotation(A);
}
//右-左双旋
AVLTree DoubleRightLeftRotation(AVLTree A){
	A->Right=SingleLeftRotation(A->Right);
	return SingleRightRotation(A);
}

AVLTree Insert(AVLTree A,ElementType X){
	if(!A){
		A=(AVLTree)malloc(sizeof(struct AVLNode));
		A->Data=X;
		A->Left=A->Right=NULL;
	}
	else if(X<A->Data){
		A->Left=Insert(A->Left,X);
		if(GetHeight(A->Left)-GetHeight(A->Right)==2)
			if(X<A->Left->Data)
				A=SingleLeftRotation(A);
			else
				A=DoubleLeftRightRotation(A); 
	}
	else if(X>A->Data){
		A->Right=Insert(A->Right,X);
		if(GetHeight(A->Left)-GetHeight(A->Right)==-2)
			if(X>A->Right->Data)
				A=SingleRightRotation(A);
			else
				A=DoubleRightLeftRotation(A);
	}
	return A;
} 

/*验证:输出函数见树的递归输出博客*/ 


int main(){
	AVLTree A=NULL;
	int n,t;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>t;
		A=Insert(A,t);
	}
	
	cout<<A->Data<<endl;
	
	return 0;
	
}

 

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/qq_43050153/article/details/84573435
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞