查找表——平衡二叉树

数据结构实验之查找二:平衡二叉树
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;
}

余生还请多多指教!

猜你喜欢

转载自blog.csdn.net/qq_42847312/article/details/81544541