二叉平衡树初步

#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
今日推荐