PAT (Advanced Level) 1066. Root of AVL Tree (25) AVL树的插入建树

An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.

《PAT (Advanced Level) 1066. Root of AVL Tree (25) AVL树的插入建树》    
《PAT (Advanced Level) 1066. Root of AVL Tree (25) AVL树的插入建树》

《PAT (Advanced Level) 1066. Root of AVL Tree (25) AVL树的插入建树》    
《PAT (Advanced Level) 1066. Root of AVL Tree (25) AVL树的插入建树》

Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (<=20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print ythe root of the resulting AVL tree in one line.

Sample Input 1:

5
88 70 61 96 120

Sample Output 1:

70

Sample Input 2:

7
88 70 61 96 120 90 65

Sample Output 2:

88
   在插入一个新结点时,有四种情况会导致AVL树失去平衡,分别为左子树外侧,左子树内侧,右子树外侧,右子树内侧;外侧的情况比较简单,对根结点一次单旋转即可使树平衡,内侧的情况需要两次单旋转,首先将与根结点的值最接近的结点旋转为根结点的子结点,然后对根节点进行一次单旋转。
   创建树时使用递归找到插入点,然后判断AVL树是否失去平衡(左右子树的高度差变为2),若失衡,判断是四种情况中的哪种,并作相应处理。
/*2015.7.28cyq*/
#include <iostream>
#include <vector>
using namespace std;

struct TNode{
	int val;
	TNode *left;
	TNode *right;
	TNode(int x):val(x),left(nullptr),right(nullptr){}
};

int height(TNode* &root){
	if(root==nullptr)
		return 0;
	else
		return max(height(root->left),height(root->right))+1;
}
TNode* singleRotateLeft(TNode* &root){//左子树外侧太深,单旋转
	TNode* tmp=root->left;
	root->left=tmp->right;
	tmp->right=root;
	return tmp;
}
TNode* singleRotateRight(TNode* &root){//右子树外侧太深,单旋转
	TNode* tmp=root->right;
	root->right=tmp->left;
	tmp->left=root;
	return tmp;
}
//双旋转时,先将待旋转子树中与root最接近的旋转为root的子结点,然后对root单旋转
TNode* doubleRotateLeft(TNode* &root){//左子树内侧太深,双旋转
	root->left=singleRotateRight(root->left);
	return singleRotateLeft(root);
}
TNode* doubleRotateRight(TNode* &root){//右子树内侧太深,双旋转
	root->right=singleRotateLeft(root->right);
	return singleRotateRight(root);
}
TNode* insert(TNode* root,int x){
	if(root==nullptr)
		root=new TNode(x);
	else if(x< root->val){
		root->left=insert(root->left,x);
		if(height(root->left)-height(root->right)==2){
			if(x< root->left->val)
				root=singleRotateLeft(root);
			else
				root=doubleRotateLeft(root);
		}
	}else{
		root->right=insert(root->right,x);
		if(height(root->right)-height(root->left)==2){
			if(x> root->right->val)
				root=singleRotateRight(root);
			else
				root=doubleRotateRight(root);
		}
	}
	return root;
}
int main(){
	int N;
	cin>>N;
	TNode *root=nullptr;
	int x;
	while(N--){
		cin>>x;
		root=insert(root,x);
	}
	cout<<root->val;
	return 0;
}
    原文作者:AVL树
    原文地址: https://blog.csdn.net/tuzigg123/article/details/47106047
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞