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.

1066 Root of AVL Tree (25 分)

 

 

1066 Root of AVL Tree (25 分)

 

 

1066 Root of AVL Tree (25 分)

 

 

1066 Root of AVL Tree (25 分)

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

 代码:

#include<iostream>
#include<algorithm>
using namespace std;
int N;
int num[25];
struct node//定义树的结点
{
    int height;//存放树的高度,用以间接获得结点的平衡因子
    int data;
    node* lchild;
    node* rchild;
};
int getheight(node *root)//获得结点的高度
{
    if(root==NULL)
        return 0;
    else 
        return root->height;
}
void updataheight(node *root)//更新结点root的高度,为左右子树中高度高的一个+1
{
    root->height=max(getheight(root->lchild),getheight(root->rchild))+1;
}
int getbalance(node *root)//获得结点的平衡因子(=左子树高度-右子树高度)
{
    return getheight(root->lchild)-getheight(root->rchild);
}
void L(node * &root)//左旋
{
        node *p=root->rchild;
        root->rchild=p->lchild;
        p->lchild=root;
        updataheight(root);
        updataheight(p);
        root=p;
}
void R(node * &root)//右旋
{
        node *p=root->lchild;
        root->lchild=p->rchild;
        p->rchild=root;
        updataheight(root);
        updataheight(p);
        root=p;
}
void insert(node *&root,int x)//插入x,注意root要用引用
{
    if(root==NULL)
    {
        root=new node;
        root->data=x;
        root->lchild=NULL;
        root->rchild=NULL;
        root->height=1;
        return;
    }
    if(root->data>x)
    {
        insert(root->lchild,x);
        updataheight(root);
        if(getbalance(root)==2)//调整树为平衡二叉树
        {
            if(getbalance(root->lchild)==1)//为LL型,进行右旋
                R(root);
            else if(getbalance(root->lchild)==-1)//为LR型,先左旋,在右旋
            {
                L(root->lchild);
                R(root);
            }
        }
    }
    else
    {
        insert(root->rchild,x);
        updataheight(root);
        if(getbalance(root)==-2)
        {
            if(getbalance(root->rchild)==-1)//为RR型,进行左旋
               L(root);
            else if(getbalance(root->rchild)==1)//为RL型,先右旋,在左旋
            {
                R(root->rchild);
                L(root);
            }
        }
    }
}
node* creat()
{
    node *root=NULL;
    for(int i=0;i<N;i++)
        insert(root,num[i]);
    return root;
}
int main()
{
    scanf("%d",&N);
    for(int i=0;i<N;i++)
        scanf("%d",num+i);
    node *root=creat();
    printf("%d",root->data);
    return 0;
}

 

上一篇:翻车小项目


下一篇:Devops 开发运维高级篇之容器管理