Root of AVL Tree

原题:

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 ythe 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 <iostream>
#include <sstream>
#include <string>
using namespace std;

template<typename T>class AVLTreeNode;
template<typename T>AVLTreeNode<T>* SingleLeftRotation(AVLTreeNode<T>* A);
template<typename T>AVLTreeNode<T>* SingleRightRotation(AVLTreeNode<T>* A);
template<typename T>AVLTreeNode<T>* DoubleLeftRightRotation(AVLTreeNode<T>* A);
template<typename T>AVLTreeNode<T>* DoubleRightLeftRotation(AVLTreeNode<T>* A);

template<typename T>class AVLTreeNode
{
public:
    T Data;
    AVLTreeNode<T>* Left;
    AVLTreeNode<T>* Right;
    int Height;
};

inline int Max(int a, int b)
{
    return a > b ? a : b;
}

template<typename T>int GetHeight(AVLTreeNode<T>* A)
{
    if(!A)
        return 0;

    return Max(GetHeight(A->Left), GetHeight(A->Right)) + 1;
}

template<typename T>AVLTreeNode<T>* AVL_Insertion(T x, AVLTreeNode<T>* t)
{
    if(!t)
    {
        t = new AVLTreeNode<T>;
        t->Data = x;
        t->Height = 0;
        t->Left = t->Right = 0;
    }
    else if(x < t->Data)
    {
        t->Left = AVL_Insertion(x, t->Left);

        if(GetHeight(t->Left) - GetHeight(t->Right) == 2)
        {
            if(x < t->Left->Data)
                t = SingleLeftRotation(t);
            else
                t = DoubleLeftRightRotation(t);
        }
    }
    else if(x > t->Data)
    {
        t->Right = AVL_Insertion(x, t->Right);

        if(GetHeight(t->Left) - GetHeight(t->Right) == -2)
        {
            if(x > t->Right->Data)
                t = SingleRightRotation(t);
            else
                t = DoubleRightLeftRotation(t);
        }
    }
    t->Height = Max(GetHeight(t->Left), GetHeight(t->Right)) + 1;
    return t;
}

template<typename T>AVLTreeNode<T>* SingleLeftRotation(AVLTreeNode<T>* A)
{
    AVLTreeNode<T>* B = A->Left; // A-88
    A->Left = B->Right;
    B->Right = A; // B-70
    A->Height = Max(GetHeight(A->Left), GetHeight(A->Right)) + 1;
    B->Height = Max(GetHeight(B->Left), A->Height) + 1;

    return B;
}

template<typename T>AVLTreeNode<T>* SingleRightRotation(AVLTreeNode<T>* A)
{
    AVLTreeNode<T>* B = A->Right;
    A->Right = B->Left;
    B->Left = A;
    A->Height = Max(GetHeight(A->Left), GetHeight(A->Right)) + 1;
    B->Height = Max(A->Height, GetHeight(B->Right)) + 1;

    return B;
}

template<typename T>AVLTreeNode<T>* DoubleLeftRightRotation(AVLTreeNode<T>* A)
{
    A->Left = SingleRightRotation(A->Left);

    return SingleLeftRotation(A);
}

template<typename T>AVLTreeNode<T>* DoubleRightLeftRotation(AVLTreeNode<T>* A)
{
    A->Right = SingleLeftRotation(A->Right);

    return SingleRightRotation(A);
}

int main(void)
{
    int n, tmp;
    cin >> n;
    string line;
    cin.ignore(100, '\n');
    getline(cin, line, '\n');
    istringstream stream(line);
    AVLTreeNode<int>*t = NULL;

    for(int i = 0; i < n; ++i)
    {
        stream >> tmp;
        t = AVL_Insertion(tmp, t);
    }
    cout << t->Data << endl;
    return 0;
}



时间: 2024-07-30 21:43:00

Root of AVL Tree的相关文章

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-树5 Root of AVL Tree + AVL树操作集

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)【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

PAT Root of AVL Tree

Root of AVL Tree 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. F

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

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

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

PAT 1066 Root of AVL Tree[AVL树][难]

1066 Root of AVL Tree (25)(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

PTA (Advanced Level)1066 Root of AVL Tree

Root of AVL Tree 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. F

PAT_A1066#Root of AVL Tree

Source: PAT A1066 Root of AVL Tree (25 分) Description: 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, rebalanci