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.
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.
For each test case, print the root of the resulting AVL tree in one line.
5
88 70 61 96 120
70
7
88 70 61 96 120 90 65
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
- 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
- int t;
- cin>>t;
- read(tree,t);
- }
- cout<
node; - return 0;
- }