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;
}


猜你喜欢

转载自blog.csdn.net/weixin_43824158/article/details/85227280
今日推荐