3374->数据结构实验之查找二:平衡二叉树

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int data,dp;         //定义data临时数据,dp为数的深度
    node *l,*r;          //定义l和r是树的左右节点
};
int deep(node *tree)
{
    if(tree==NULL)
        return -1;          //这个很重要如果树的节点为空深度为-1,也可以更改为0,看个人喜好
    return tree->dp;        //其他就return tree->dp就行了
}
node *LL(node *tree)         //定义右旋函数
{
    node *p=tree->l;
    tree->l=p->r;
    p->r=tree;
    p->dp=max(deep(p->l),deep(p->r))+1;
    tree->dp=max(deep(tree->l),deep(tree->r))+1;
    return p;
}
node *RR(node *tree)         //定义左旋函数
{
    node *p=tree->r;
    tree->r=p->l;
    p->l=tree;
    p->dp=max(deep(p->l),deep(p->r))+1;
    tree->dp=max(deep(tree->l),deep(tree->r))+1;
    return p;
}
node *LR(node *tree)
{
    tree->l=RR(tree->l);    //LR类型先通过左旋转换成LL类型,再右旋
    return LL(tree);
}
node *RL(node *tree)
{
    tree->r=LL(tree->r);    //RL类型先通过右旋转换成RR类型,再左旋
    return RR(tree);
}
node *insert_(node *tree,int x)   //这就是本题的精髓所在了,为建立平衡二叉树的主函数
{
    if(tree==NULL)                 //这个应该很清楚了吧,就是让第一个元素当成树头
    {
        tree=new node;
        tree->data=x;
        tree->dp=0;
        tree->l=tree->r=NULL;
    }
    else if(x<tree->data)
    {
        tree->l=insert_(tree->l,x);        //如果要插入的元素小于头,就往左找
        if(deep(tree->l)-deep(tree->r)>1)   //此时不平衡,要旋转
        {
            if(x<tree->l->data)
                tree=LL(tree);
            else
                tree=LR(tree);
        }
    }
    else if(x>tree->data)            //如果要插入的元素大于头,就往右找,注意这里不能直接填else,否则会Runtime error,目的是为了保持程序的稳定性。
    {
        tree->r=insert_(tree->r,x);
        if(deep(tree->r)-deep(tree->l)>1)
        {
            if(x<tree->r->data)
                tree=RL(tree);
            else
                tree=RR(tree);
        }
    }
    tree->dp=max(deep(tree->l),deep(tree->r))+1;
    return tree;
}
int main()
{
    int n,m;
    cin>>n;
    node *tree=NULL;
    for(int i=0; i<n; i++)
    {
        cin>>m;
        tree=insert_(tree,m);
    }
    cout<<tree->data<<endl;
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值