04-树5 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 (≤) 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
#include<cstdio>
#include<algorithm>
using namespace std;

struct Node
{
    int v;
    int height;
    Node *lchild, *rchild;
}*root;

void Insert(Node* &root,int v);
Node* NewNode(int v);
void updateHeight(Node *root);
int getHeight(Node* root);
int getBalanceFactor(Node* root);
Node* R(Node* &root);
Node* L(Node* &root);

int main()
{
    int n;
    int v;
    scanf("%d",&n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d",&v);
        Insert(root,v);
    }
    printf("%d",root->v);
    return 0;
}

void Insert(Node* &root, int v)
{
    if (NULL == root)
    {
        root = NewNode(v);
        return ;
    }

    if (root->v > v)
    {
        Insert(root->lchild,v);
        updateHeight(root);
        if (2 == getBalanceFactor(root))
        {
            if (1 == getBalanceFactor(root->lchild))
            {
                R(root);
            }
            else if(-1 == getBalanceFactor(root->lchild))
            {
                L(root->lchild);
                R(root);
            }
        }
    }
    else
    {
        Insert(root->rchild,v);
        updateHeight(root);
        if (-2 == getBalanceFactor(root))
        {
            if (-1 == getBalanceFactor(root->rchild))
            {
                L(root);
            }
            else if(1 == getBalanceFactor(root->rchild))
            {
                R(root->rchild);
                L(root);
            }
        }
    }
}

Node* NewNode(int v)
{
    Node* node = new Node;
    node->lchild = node->rchild = NULL;
    node->v = v;
    node->height = 1;
    return node;
}

void updateHeight(Node *root)
{
    root->height = max(getHeight(root->lchild),getHeight(root->rchild)) + 1;

}

int getHeight(Node* root)
{
    if (NULL == root)
    {
        return 0;
    }
    else
    {
        return root->height;
    }
}

int getBalanceFactor(Node* root)
{
    return getHeight(root->lchild) - getHeight(root->rchild);
}

Node* R(Node* &root)
{
    Node *tmp = root->lchild;
    root->lchild = tmp->rchild;
    tmp->rchild = root;
    updateHeight(root);
    updateHeight(tmp);
    root = tmp;
}

Node* L(Node* &root)
{
    Node *tmp = root->rchild;
    root->rchild = tmp->lchild;
    tmp->lchild = root;
    updateHeight(root);
    updateHeight(tmp);
    root = tmp;
}

原文地址:https://www.cnblogs.com/wanghao-boke/p/11748765.html

时间: 2024-10-15 09:00:48

04-树5 Root of AVL Tree (25 分)的相关文章

PAT 甲级 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

A1066 Root of AVL Tree (25分)

一.技术总结 这是一个平衡二叉树AVL树,就是一个二叉查找树,但是平衡因子不能够超过1. 这个树的数据结构比一般的要多一个height的参数,用于计算平衡因子,就是用当前结点的左子树的height减去右子树的height. 对于node* newNode(int data)函数,首先要新建一个结点,然后初始化height参数为1,然后左右子树结点赋值为NULL. getHeight()函数和updateHeight()函数,后者就是根据当前结点的左右子树结点高度的最大值,然后加一. getBF(

1066. Root of AVL Tree (25)【AVL树】——PAT (Advanced Level) Practise

题目信息 1066. Root of AVL Tree (25) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B 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 tha

04-树4. Root of AVL Tree (25)

04-树4. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 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 tim

04-1. Root of AVL Tree (25)

04-1. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 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

pat04-树4. Root of AVL Tree (25)

04-树4. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 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 tim

pat1066. Root of AVL Tree (25)

1066. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue 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 tim

A1066. 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 illust

1066. Root of AVL Tree (25)

时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue 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 o