题目描述
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
输入
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
输出
输出平衡二叉树的树根。
示例输入
5 88 70 61 96 120
示例输出
70
/*#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef struct BNode
{
int data;
int d;//记录树的深度;
BNode *lchild,*rchild;
}*BiTree;
int deep(BiTree &T)
{
if(!T)
return 0;
return T->d;
}
BiTree LL(BiTree &T)//向右旋型
{
BiTree p;
p=T->lchild;
T->lchild=p->rchild;
p->rchild=T;
p->d=max(deep(p->lchild),deep(p->rchild))+1;
T->d=max(deep(T->lchild),deep(T->rchild))+1;
return p;
}
BiTree RR(BiTree &T)//向左型旋;
{
BiTree p;
p=T->rchild;
T->rchild=p->lchild;
p->lchild=T;
p->d=max(deep(p->lchild),deep(p->rchild))+1;
T->d=max(deep(T->lchild),deep(T->rchild))+1;
return p;
}
BiTree LR(BiTree &T)//旋转分两步:1.以a为根结点的RR旋转 2.以x为根结点的LL旋转
{
T->lchild=RR(T->lchild);
return LL(T);
}
BiTree RL(BiTree &T)//旋转分两步:1.以a为根结点的LL旋转 2.以x为根结点的RR旋转
{
T->rchild=LL(T->rchild);
return RR(T);
}
BiTree Insert(BiTree &T,int n)
{
if(!T)
{
T=new BNode;
T->lchild=T->rchild=NULL;
T->data=n;
T->d=1;
}
else if(n<T->data)
{
T->lchild=Insert(T->lchild,n);
if(deep(T->lchild)-deep(T->rchild)>1)
{
if(n<T->lchild->data)
T=LL(T);
else
T=LR(T);
}
}
else if(n>T->data)
{
T->rchild=Insert(T->rchild,n);
if(deep(T->rchild)-deep(T->lchild)>1)
{
if(n>T->rchild->data)
T=RR(T);
else
T=RL(T);
}
}
T->d=max(deep(T->lchild),deep(T->rchild))+1;
return T;
}
int main()
{
int n,num;
scanf("%d",&n);
BiTree T;
T=NULL;//树的初始化。
for(int i=0;i<n;i++)
{
scanf("%d",&num);
Insert(T,num);
}
printf("%d\n",T->data);
return 0;
}*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>//max函数在此头文件中;
using namespace std;
typedef struct BNode
{
int data;
int d;
BNode *lchild,*rchild;
}*BiTree;
int n;
int deep(BiTree T)
{
if(!T)
return -1;
return T->d;
}
BiTree LL(BiTree &T)
{
BiTree p;
p=T->lchild;
T->lchild=p->rchild;
p->rchild=T;
p->d=max(deep(p->lchild),deep(p->rchild))+1;
T->d=max(deep(T->lchild),deep(T->rchild))+1;
return p;
}
BiTree RR(BiTree &T)
{
BiTree p;
p=T->rchild;
T->rchild=p->lchild;
p->lchild=T;
p->d=max(deep(p->rchild),deep(p->lchild))+1;
T->d=max(deep(T->rchild),deep(T->lchild))+1;
return p;
}
BiTree LR(BiTree &T)
{
T->lchild=RR(T->lchild);
return LL(T);
}
BiTree RL(BiTree &T)
{
T->rchild=LL(T->rchild);
return RR(T);
}
BiTree Insert(BiTree &T,int x)
{
if(!T)
{
T=new BNode;
T->lchild=T->rchild=NULL;
T->data=x;
T->d=0;
}
else if(x<T->data)
{
Insert(T->lchild,x);
if(deep(T->lchild)-deep(T->rchild)>1)
{
if(x<T->lchild->data)
T=LL(T);
else
T=LR(T);
}
}
else if(x>=T->data)
{
Insert(T->rchild,x);
if(deep(T->rchild)-deep(T->lchild)>1)
{
if(x>T->rchild->data)
T=RR(T);
else
T=RL(T);
}
}
T->d=max(deep(T->rchild),deep(T->lchild))+1;
return T;
}
int main()
{
scanf("%d",&n);
int num;
BiTree T;
T=NULL;
for(int i=1;i<=n;i++)
{
scanf("%d",&num);
T=Insert(T,num);
}
printf("%d\n",T->data);
}