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