1066. Root of AVL Tree (25)

Posted Dyleaf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1066. Root of AVL Tree (25)相关的知识,希望对你有一定的参考价值。

1066. Root of AVL Tree (25)

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

分析: 根据avl的性质进行创建

? AVL树一共有四种情况,将树不平衡的那个结点叫做A结点,A发现树不平衡的情况有四种:

  • 新来的结点插入到A的左子树的左子树(不平衡时:右旋)
  • 新来的结点插入到A的左子树的右子树(不平衡时:A的左树左旋,A右旋)
  • 新来的结点插入到A的右子树的左子树(不平衡时:A的右子树右旋,A左旋)
  • 新来的结点插入到A的右子树的右子树(不平衡时:左旋)
#include <bits/stdc++.h>
using namespace std;
struct node {
    int val;
    struct node *left, *right;
};
node *rotateLeft(node *root) {
    node *t = root->right;
    root->right = t->left;
    t->left = root;
    return t;
}
node *rotateRight(node *root) {
    node *t = root->left;
    root->left = t->right;
    t->right = root;
    return t;
}
node *rotateLeftRight(node *root) {
    root->left = rotateLeft(root->left);
    return rotateRight(root);
}
node *rotateRightLeft(node *root) {
    root->right = rotateRight(root->right);
    return rotateLeft(root);
}
int getHeight(node *root) {
    if(root == NULL) return 0;
    return max(getHeight(root->left), getHeight(root->right)) + 1;
}
node *insert(node *root, int val) {
    if(root == NULL) {
        root = new node();
        root->val = val;
        root->left = root->right = NULL;
    } else if(val < root->val) {
        root->left = insert(root->left, val);
        if(getHeight(root->left) - getHeight(root->right) == 2)
            root = val < root->left->val ? rotateRight(root) : rotateLeftRight(root);
    } else {
        root->right = insert(root->right, val);
        if(getHeight(root->left) - getHeight(root->right) == -2)
            root = val > root->right->val ? rotateLeft(root) : rotateRightLeft(root);
    }
    return root;
}
int main() {
    int n, val;
    scanf("%d", &n);
    node *root = NULL;
    for(int i = 0; i < n; i++) {
        scanf("%d", &val);
        root = insert(root, val);
    }
    printf("%d", root->val);
    return 0;
}

以上是关于1066. Root of AVL Tree (25)的主要内容,如果未能解决你的问题,请参考以下文章

1066 Root of AVL Tree (25)

PAT 1066. Root of AVL Tree

A1066. Root of AVL Tree

1066 Root of AVL Tree

PAT 甲级 1066 Root of AVL Tree

PAT_A1066#Root of AVL Tree