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 they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.

04-1. Root of AVL Tree (25)     04-1. Root of AVL Tree (25)

04-1. Root of AVL Tree (25)     04-1. 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 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

提交代


题意:给你n个数  输出以他们建立的平衡查找树的根结点

参考:http://www.cppblog.com/cxiaojia/archive/2013/07/22/187776.html

http://blog.csdn.net/realxuejin/article/details/12872035 两篇博文

#include <iostream>
#include <algorithm>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
//#define lson rt<<1,l,MID
//#define rson rt<<1|1,MID+1,r
//#define lson root<<1
//#define rson root<<1|1
//#define MID ((l+r)>>1)
typedef long long ll;
typedef pair<int,int> P;
const int maxn=50005;
const int base=1000;
const int inf=999999;
const double eps=1e-5;
struct node//树的结点
{
    int data;//数据域
    int high;///树的高度
    node *lson,*rson;//左右儿子
    node(){lson=rson=NULL;high=0;}//构造函数  初始化的作用
};

int getHigh(node *t)//取高度函数
{
   if(t!=NULL)
       return t->high;
   return -1;
}
node *LL(node *k2)//左左单旋
{
    node *k1;
    k1=k2->lson;
    k2->lson=k1->rson;
    k1->rson=k2;

    k2->high=max(getHigh(k2->lson),getHigh(k2->rson))+1;
    k1->high=max(getHigh(k1->lson),getHigh(k1->rson))+1;
    return k1;
}

node *RR(node *k2)//右右单旋
{
    node *k1;
    k1=k2->rson;
    k2->rson=k1->lson;
    k1->lson=k2;
    k2->high=max(getHigh(k2->lson),getHigh(k2->rson))+1;
    k1->high=max(getHigh(k1->lson),getHigh(k1->rson))+1;
    return k1;
}

node* LR(node *k3)//左右双旋
{
    k3->lson=RR(k3->lson);
    return LL(k3);

}

node* RL(node * k3)//右左双旋
{
    k3->rson=LL(k3->rson);
    return RR(k3);
}

bool isbalanced(node *a,node *b)//判定左右子树高度差
{
    return abs(getHigh(a)-getHigh(b))<2;
}

node* insert(node *root,int v)//建立树的过程
{
    if(root==NULL)
    {
        root=new node();
        root->data=v;
        return root;
    }
    if(v>root->data)
    {
        root->rson=insert(root->rson,v);
        if(!isbalanced(root->lson,root->rson))
        {
            if(v>root->rson->data)
                root=RR(root);
            else
                root=RL(root);
        }

    }
    else
    {
        root->lson=insert(root->lson,v);
        if(!isbalanced(root->lson,root->rson))
        {
            if(v>root->lson->data)
                root=LR(root);
            else
                root=LL(root);
        }
    }
    root->high=max(getHigh(root->lson),getHigh(root->rson))+1;
    return root;
}
int main()
{
    int n,m,j,i,k,t;
    cin>>n;
    node* T=NULL;
    while(n--)
    {
        cin>>t;
        T=insert(T,t);
    }
    printf("%d\n",T->data);
    return 0;
}

























你可能感兴趣的:(tree)