数据结构实验之查找二:平衡二叉树
Time Limit: 400MS Memory limit: 65536K
题目描述
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
输入
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
输出
输出平衡二叉树的树根。
示例输入
5 88 70 61 96 120
示例输出
70
#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
int data,d;
struct node *lchild,*rchild;
} Tree;
int Max(int x,int y)
{
return x>y?x:y;
}
int deep(Tree *root)
{
if(!root)
return -1;
else
return root->d;
}
Tree *LL(Tree *root)
{
Tree *p;
p=root->lchild;
root->lchild=p->rchild;
p->rchild=root;
p->d=Max(deep(p->lchild),deep(p->rchild))+1;
root->d=Max(deep(root->lchild),deep(root->rchild))+1;
return p;
}
Tree *RR(Tree *root)
{
Tree *p;
p=root->rchild;
root->rchild=p->lchild;
p->lchild=root;
p->d=Max(deep(p->lchild),deep(p->rchild))+1;
root->d=Max(deep(root->lchild),deep(root->rchild))+1;
return p;
}
Tree *LR(Tree *root)
{
root->lchild=RR(root->lchild);
return LL(root);
}
Tree *RL(Tree *root)
{
root->rchild=LL(root->rchild);
return RR(root);
}
Tree *creat(Tree *root,int n)
{
if(!root)
{
root=(Tree *)malloc(sizeof(Tree));
root->lchild=root->rchild=NULL;
root->data=n;
root->d=0;
}
else if(n<root->data)
{
root->lchild=creat(root->lchild,n);
if(deep(root->lchild)-deep(root->rchild)>1)
{
if(n<root->lchild->data)
root=LL(root);
else
root=LR(root);
}
}
else if(n>root->data)
{
root->rchild=creat(root->rchild,n);
if(deep(root->rchild)-deep(root->lchild)>1)
{
if(n>root->rchild->data)
root=RR(root);
else
root=RL(root);
}
}
root->d=Max(deep(root->lchild),deep(root->rchild))+1;
return root;
}
int main()
{
int n;
scanf("%d",&n);
Tree *root;
root=NULL;
for(int i=0; i<n; i++)
{
int x;
scanf("%d",&x);
root=creat(root,x);
}
printf("%d\n",root->data);
return 0;
}