数据结构实验之查找二:平衡二叉树
Time Limit: 400MS
Memory Limit: 65536KB
Problem Description
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
Input
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
Output
输出平衡二叉树的树根。
Example Input
5 88 70 61 96 120
Example Output
70
#include <iostream>
using namespace std;
struct node
{
int data;
node *l,*r;
int h;//平衡因子
};
int high(node *p)
{
if(!p)
return -1;
return p->h;
}
node *ll(node *head)
{
node *p=head->l;
head->l=p->r; p->r=head;
head->h=max(high(head->l),high(head->r))+1;//更新结点高度值
p->h=max(high(p->l),head->h)+1;
return p;
}
node *rr(node *head)
{
node *p=head->r;
head->r=p->l; p->l=head;
head->h=max(high(head->l),high(head->r))+1;
p->h=max(high(p->r),head->h)+1;
return p;
}
node *lr(node *head)
{
head->l=rr(head->l);//左子树右旋
return ll(head);//整体左旋
}
node *rl(node *head)
{
head->r=ll(head->r);//右子树左旋
return rr(head);//整体右旋
}
node *cre(node *head,int x)
{
if(!head)//开辟新节点
{
head=new node;
head->l=head->r=NULL;
head->data=x;
head->h=0;
}
else if(x<head->data)//小于data就插入左子树
{
head->l=cre(head->l,x);
if(high(head->l)-high(head->r)==2)//不平衡
{
if(x<head->l->data)//ll型
head=ll(head);
else //lr型
head=lr(head);
}
}
else if(x>head->data)//大于data就插入右子树
{
head->r=cre(head->r,x);
if(high(head->r)-high(head->l)==2)//不平衡
{
if(x>head->r->data)//rr型
head=rr(head);
else //rl型
head=rl(head);
}
}
head->h=max(high(head->l),high(head->r))+1;
return head;
}
int main()
{
int n;
while(cin>>n)
{
node *head=NULL;
while(n--)
{
int x;
cin>>x;
head=cre(head,x);
}
cout<<head->data<<endl;
}
return 0;
}
#include <iostream>
using namespace std;
struct node
{
int data;
node *l,*r;
int h;//平衡因子
};
int high(node *p)
{
if(!p)
return -1;
return p->h;
}
node *ll(node *head)
{
node *p=head->l;
head->l=p->r; p->r=head;
head->h=max(high(head->l),high(head->r))+1;//更新结点高度值
p->h=max(high(p->l),head->h)+1;
return p;
}
node *rr(node *head)
{
node *p=head->r;
head->r=p->l; p->l=head;
head->h=max(high(head->l),high(head->r))+1;
p->h=max(high(p->r),head->h)+1;
return p;
}
node *lr(node *head)
{
head->l=rr(head->l);//左子树右旋
return ll(head);//整体左旋
}
node *rl(node *head)
{
head->r=ll(head->r);//右子树左旋
return rr(head);//整体右旋
}
node *cre(node *head,int x)
{
if(!head)//开辟新节点
{
head=new node;
head->l=head->r=NULL;
head->data=x;
head->h=0;
}
else if(x<head->data)//小于data就插入左子树
{
head->l=cre(head->l,x);
if(high(head->l)-high(head->r)==2)//不平衡
{
if(x<head->l->data)//ll型
head=ll(head);
else //lr型
head=lr(head);
}
}
else if(x>head->data)//大于data就插入右子树
{
head->r=cre(head->r,x);
if(high(head->r)-high(head->l)==2)//不平衡
{
if(x>head->r->data)//rr型
head=rr(head);
else //rl型
head=rl(head);
}
}
head->h=max(high(head->l),high(head->r))+1;
return head;
}
int main()
{
int n;
while(cin>>n)
{
node *head=NULL;
while(n--)
{
int x;
cin>>x;
head=cre(head,x);
}
cout<<head->data<<endl;
}
return 0;
}