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.
![](http://www.patest.cn/upload/79_mtxjq1kj3gx.jpg)
![](http://www.patest.cn/upload/79_mtxjqnwja2o.jpg)
![](http://www.patest.cn/upload/79_mtxjr4gyzdg.jpg)
![](http://www.patest.cn/upload/79_mtxjrh51o9y.jpg)
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 120Sample Output 1:
70Sample Input 2:
7 88 70 61 96 120 90 65Sample 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; }