04-1. Root of AVL Tree (PAT) - 二叉平衡樹問題


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

題意:將輸入調整為平衡二叉樹(AVL),輸出根結點元素
解題思路:判斷插入結點對現有結點的平衡因子的影響,進而進行LL,LR,RL,RR旋轉
假設三個結點連接關系為A->B->C,C為新插入結點並使得A的平衡因子==2
若C在A的左孩子的左子樹上,則對A與B進行LL旋轉
若C在A的左孩子的右子樹上,則對A,B,C進行LR旋轉,可分解為首先對B與C進行RR旋轉,再對A與C進行LL旋轉
若C在A的右孩子的右子樹上,則對A與B進行RR旋轉
若C在A的右孩子的左子樹上,則對A,B,C進行RL旋轉,可分解為首先對B與C進行LL旋轉,再對A與C進行RR旋轉

#include <iostream>
#include <string>

typedef struct AVLTreeNode{
    int Data;
    AVLTreeNode *Left;
    AVLTreeNode *Right;
    int Height;
}nAVLTree ,*pAVLTree;

pAVLTree AVLInsertion( int nodeValue, pAVLTree pAvl );
int GetALVHeight( pAVLTree );
pAVLTree SingleLeftRotation( pAVLTree );
pAVLTree DoubleLeftRotation( pAVLTree );
pAVLTree SingleRightRotation( pAVLTree );
pAVLTree DoubleRightRotation( pAVLTree );
int Max( int hight1, int hight2 );
using namespace std;

int main()
{
    int num;
    int i;
    int value;
    pAVLTree pAvl;
    pAvl = NULL;
    cin >> num;
    for ( i = 0; i < num; i++ )
    {
        cin >> value;
        pAvl = AVLInsertion( value, pAvl);
    }
    cout << pAvl->Data;
}

pAVLTree AVLInsertion( int nodeValue, pAVLTree pAvl )
{
    if ( pAvl == NULL )
    {
        pAvl = ( pAVLTree )malloc( sizeof( nAVLTree ) );
        pAvl->Left = pAvl->Right = NULL;
        pAvl->Data = nodeValue;
        pAvl->Height = 0;
    }
    else if ( nodeValue < pAvl->Data )
    {
        pAvl->Left = AVLInsertion( nodeValue, pAvl->Left );
        if ( GetALVHeight( pAvl->Left ) - GetALVHeight( pAvl->Right ) == 2 )
        {
            if ( nodeValue < pAvl->Left->Data )
            {
                pAvl = SingleLeftRotation( pAvl );
            }
            else
            {
                pAvl = DoubleLeftRotation( pAvl );
            }
        }
    }
    else if ( nodeValue > pAvl->Data )
    {
        pAvl->Right = AVLInsertion( nodeValue, pAvl->Right );
        if ( GetALVHeight( pAvl->Right ) - GetALVHeight( pAvl->Left ) == 2 )
        {
            if ( nodeValue > pAvl->Right->Data )
            {
                pAvl = SingleRightRotation( pAvl );
            }
            else
            {
                pAvl = DoubleRightRotation( pAvl );
            }
        }
    }
    pAvl->Height = Max( GetALVHeight( pAvl->Left ), GetALVHeight( pAvl->Right ) ) + 1;
    return pAvl;
}

pAVLTree SingleLeftRotation( pAVLTree A )
{
    pAVLTree B = A->Left;
    A->Left = B->Right;
    B->Right = A;
    A->Height = Max( GetALVHeight( A->Left ), GetALVHeight( A->Right ) ) + 1;
    B->Height = Max( GetALVHeight( B->Left ), A->Height ) + 1;
    return B;
}

pAVLTree DoubleLeftRotation( pAVLTree A )
{
    A->Left = SingleRightRotation( A->Left );
    return SingleLeftRotation( A );
}

pAVLTree SingleRightRotation( pAVLTree A )
{
    pAVLTree B = A->Right;
    A->Right = B->Left;
    B->Left = A;
    A->Height = Max( GetALVHeight( A->Left ), GetALVHeight( A->Right ) ) + 1;
    B->Height = Max( GetALVHeight( B->Right ), A->Height ) + 1;
    return B;
}

pAVLTree DoubleRightRotation( pAVLTree A )
{
    A->Right = SingleLeftRotation( A->Right );
    return SingleRightRotation( A );
}

int GetALVHeight( pAVLTree pAvl)
{
    if ( pAvl == NULL )
    {
        return 0;
    }
    else
    {
        return pAvl->Height;
    }
}

int Max( int hight1, int hight2 )
{
    return hight1 > hight2 ? hight1 : hight2;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM