您的位置:首页 > 理论基础 > 数据结构算法

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

2018-12-23 23:11 155 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: