数据结构实验之查找二:平衡二叉树
Time Limit: 400 ms Memory Limit: 65536 KiB
Problem Description
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
Input
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
Output
输出平衡二叉树的树根。
Sample Input
5
88 70 61 96 120
Sample Output
70
**提示:**平衡二叉树是建立在二叉查找树的基础上的。二者的区别是,平衡二叉树左、右子树高度相差不能大于1。若大于1,则经旋转
LL:
RR:
LR:
RL:
AC代码:
#include<iostream>
using namespace std;
struct tree
{
int data,h;
tree *l,*r;
};
int dp(tree *p)//树的高度
{
if(!p)
return -1;
return p->h;
}
void LL(tree *&p)//LL旋转 //*&p:指向p的地址,可把&p视为一个整体 //p等价root
{
tree *q=p->l;
p->l=q->r;
q->r=p;
p->h=max(dp(p->r),dp(p->l))+1;
q->h=max(p->h,dp(q->l))+1;
p=q;
}
void RR(tree *&p)//RR旋转
{
tree *q=p->r;
p->r=q->l;
q->l=p;
p->h=max(dp(p->l),dp(p->r))+1;
q->h=max(dp(q->r),p->h)+1;
p=q;
}
void LR(tree *&p)//LR旋转
{
RR(p->l);
LL(p);
}
void RL(tree *&p)//RL旋转
{
LL(p->r);
RR(p);
}
void cp(tree *&p,int X)//建平衡二叉树
{
if(!p)
{
p=new tree;
p->data=X;
p->l=p->r=NULL;
p->h=1;
}
else if(X<p->data)
{
cp(p->l,X);
if(dp(p->l)-dp(p->r)>1)//左、右子树的高度差不能超过1,不然会失去平衡———)旋转
{
if(X<p->l->data)
LL(p);
else
LR(p);
}
}
else if(X>p->data)
{
cp(p->r,X);
if(dp(p->r)-dp(p->l)>1)
{
if(X>p->r->data)
RR(p);
else RL(p);
}
}
p->h=max(dp(p->l),dp(p->r))+1;
}
int main()
{
int n;
tree *root;
cin>>n;
root=NULL;
while(n--)
{
int x;
cin>>x;
cp(root,x);
}
cout<<root->data<<endl;
return 0;
}
余生还请多多指教!