#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int ec[105],n,a,zz;//定义一个树ec,树的指针zz,输入元素的个数n,元素统一用a输入
int sc(int zz)
{
if(ec[zz*2]==0&&ec[zz*2+1]==0)//如果它无儿无女,就直接删
ec[zz]=0;
else if(ec[zz*2]==0&&ec[zz*2+1]!=0)//如果它没左儿子 却有右儿子,就让它的右儿子上来
{
ec[zz]=ec[zz*2+1],ec[zz*2+1]=0;
sc(zz*2+1);//上来了以后右儿子也是空了,就又要从他的右儿子的儿孙之中找一个上来
}
else
{
int k=zz;
k=k*2;
while(ec[k*2+1]!=0)//不然就从它的左儿子子孙中找到最大的一个
k=k*2+1;
ec[zz]=ec[k];
ec[k]=0;
sc(k);//给他的空位善后
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)//插入数值
{
zz=1; //将指针定义为树的根节点
cin>>a;
while(ec[zz]!=0)//当当前指针所指的对象不为空,也就是这里有元素时,继续寻找
{
if(a<=ec[zz])//当这个新元素小于当前所指节点时,它去左儿子路线
zz*=2;
else
zz=zz*2+1;//不然去右儿子路线
}
ec[zz]=a;//存放元素
}
int jsq=1;//打印二叉搜索树
for(int i=1;i<=n*2+1;)
{
for(int j=1;j<=jsq;j++,i++)
cout<<ec[i]<<" ";
jsq*=2;
cout<<endl;
}
//删除数值
int cc,sz;
cin>>cc;
for(int i=1;i<=cc;i++)
{
cin>>sz;
zz=1;
while(sz!=ec[zz])//删除的第一步是找到要删除数值的编号
{
if(sz>ec[zz])
zz=zz*2+1;
if(sz<ec[zz])
zz*=2;
}
sc(zz);
}
jsq=1;//打印二叉搜索树
for(int i=1;i<=n*2+1;)
{
for(int j=1;j<=jsq;j++,i++)
cout<<ec[i]<<" ";
jsq*=2;
cout<<endl;
}
//查找数值
int q,p;
int pd;
cin>>p;
for(int i=1;i<=p;i++)
{
cin>>q;
pd=0;
zz=1;
while(q!=ec[zz])//当它没有到达位置时
{
if(q>ec[zz])//假如这个数值大于当前编号,就去右儿子
zz=zz*2+1;
if(q<ec[zz])//不然去左儿子
zz*=2;
if(q!=ec[zz]&&(ec[zz*2]==0&&ec[zz*2+1]==0)||(q>ec[zz]&&ec[zz*2+1]==0)||(q<ec[zz]&&ec[zz*2]==0))
/*当它的左儿子与右儿子都没有时且他还不等于当前指针时,它就不在这个树中存在;又若是它不等于当前编号
,且它大于这个编号却没有儿子时 他也不存在;再若是它小于这个编号,却没有左儿子时,也不在这个树中存在
*/
{
pd=1;
break;
}
}
if(!pd)
{
cout<<"Yes "<<zz<<endl;
}
else
{
cout<<"No "<<endl;
}
}
}
二叉平衡树初步
猜你喜欢
转载自blog.csdn.net/PUBG___/article/details/85227978
今日推荐
周排行