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.
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 the 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
解题思路:
题目意思很清楚了,就是给你一个数组,让你构造平衡二叉搜索树。这里就涉及到树的旋转问题,关于树的旋转分为4类分别为LL,RR,LR,RL;对于后面两种,分别可以先对它的子树进行RR或先进行LL,转换后变成LL或RR类型,所以我主要还是讲一下LL和RR的旋转方法。
LL类就是在当前根节点的左子树的左子树上插入了新的节点,导致树不平衡,需要旋转来构造新的平衡。例如原题中的这张图就是LL类型(图中左数的深度为2,右数的深度为0,发生了不平衡):
对于此,我们的做法是:此时不平衡的点权重为88记作root;
t = root->left; root->left = t->right; t->right = root; return t;
意思就是,把左树的节点作为根节点,左树的左树为根的左树,左树的右树,为root的左树
右树类似。
易错点:
只有读取入新的节点的时候才有可能会造成原来树的不平衡,所以只要在插入新节点的时候
代码:
#include<bits/stdc++.h>
using namespace std;
typedef struct node Tree;
struct node{
int node;
Tree* left;
Tree* right;
};
Tree* LL(Tree* root){
Tree* t = root->left;
root->left = t->right;
t->right = root;
return t;
}
Tree* RR(Tree* root){
Tree* t = root->right;
root->right = t->left;
t->left = root;
return t;
}
Tree* LR(Tree* root){
root->left = RR(root->left);
return LL(root);
}
Tree* RL(Tree* root){
root->right = LL(root->right);
return RR(root);
}
int getHeight(Tree* root){
if(root == NULL){
return 0;
}
return max(getHeight(root->left),getHeight(root->right))+1;
}
void read(Tree* &root, int val){
if(root == NULL){
root = new Tree();
root->left = NULL;
root->right = NULL;
root->node = val;
}else if(val < root->node){
read(root->left,val);
if(getHeight(root->left)-getHeight(root->right) == 2){
root = val < root->left->node ? LL(root):LR(root);
}
}
else{
read(root->right,val);
if(getHeight(root->left)-getHeight(root->right) == -2){
root = val > root->right->node ? RR(root):RL(root);
}
}
}
int main(){
int N;
cin>>N;
Tree* tree = NULL;
for(int i=0;i<N;i++){
int t;
cin>>t;
read(tree,t);
}
cout<<tree->node;
return 0;
}