• B树的插入与删除


    //这是一个奇数阶b树
    #include<iostream.h>

    #define m 5
    typedef struct nd
    {
     int keynum;
     int data[m+1];
     struct nd *chd[m+1];
     struct nd *pr;
    }btnode,*pbtnode;

    class btree
    {
    private:
     pbtnode root;
    public:
     btree()
     {
      root=0;
      int i;
      cout<<"enter node infor ,0 is the endl/nstart:";
    //  cin>>i;
    //  while(i)
    //  {
       for(i=100;i>0;i--)
      // for(i=1;i<9;i++)
       {
        if(i==12)
         call();
       InsertBtree(root,i);
       }
      
    //   cin>>i;
    //  }
     }

     void call()
     {
      return;
     }

     int search(pbtnode &rt,int k)
     {
      if(rt==0)return 0;
      for(int i=1;i<=rt->keynum&&rt->data[i]<k;i++);          //change for me
      return i;
     }

     void searchBtree(pbtnode &rt,int k,pbtnode &q,bool &bl)
     {
      while(rt)
      {
       q=rt;
    //   int i;
       int i=search(rt,k);   //how to change the deled?whow can call me?
       //damation hvae in the choose
    //      if(i>rt->keynum)
    //    i=i-1;
       if(i==0)
       {
    //    cout<<"have a null tear!/n";
        return;
       }
       if(rt->keynum<i)              //do the change for
       {
        rt=rt->chd[i-1];
       }
       else if(rt->data[i]==k)
       {
    //    cout<<"the node have in the tree!/n";
        bl=true;
        return;
       }
       //*****
      
       //*************
       else if(k<rt->data[i])
       {
        rt=rt->chd[i-1];
       }
       bl=false;
      }
     }

     //Insert the information in the tree!1

     void Insert(pbtnode &rt,int k,pbtnode ap)
     {
      if(!rt)
      {
       rt=new btnode;
       rt->data[1]=k;
       for(int i=0;i<=m;i++)
        rt->chd[i]=0;
       rt->keynum=1;
       rt->pr=0;
    //   cout<<"seceess insert!/n";
      }
      else
      {
       int i=search(rt,k);
       if(rt->data[i]==k)
       {
    //    cout<<"the node have in the tree!/n";
       }
       else
       {
        for(int j=rt->keynum;j>=i;j--)
        {
         rt->data[j+1]=rt->data[j];
        }
        for(j=rt->keynum;j>=i;j--)
        {
         rt->chd[j+1]=rt->chd[j];
        }
        rt->chd[i]=ap;
        rt->data[i]=k;
        rt->keynum++;
    //    cout<<"Insert seccess!!/n";
        if(rt->keynum==m)
        {
         slpit(rt);
        }
       }
      }
     }

     void InsertBtree(pbtnode &rt,int k)
     {
      pbtnode p=rt,q;
      bool bl;
      if(!rt)
      {
       Insert(rt,k,0);
       return;
      }
      else
      {
       searchBtree(p,k,q,bl);
       Insert(q,k,0);
      }
     }

     //*****************************************************************************
     void slpit(pbtnode &rt)
     {
      if(!rt->pr)
      {
       newroot(root);
      }
      else
      {
       btnode q=*rt;        
       int i,j;
       pbtnode p=new btnode;
     
       for(j=0, i=m/2+1;i<=m;i++,j++)  
       {       
        p->chd[j]=q.chd[i];
        if(p->chd[j]!=0)      
         p->chd[j]->pr=p;
       }
      
       for(i=1,j=m/2+2;j<=m;j++,i++)
       {
        p->data[i]=q.data[j];       //change in the here!!
       }
       rt->keynum=m/2;        
       p->keynum=m/2;
       p->pr=rt->pr;
       int n=rt->data[m/2+1];
       Insert(q.pr,n,p);
      }
    //  cout<<"insert up seccess!/n";
     }
     //*****************************************************************************

     void newroot(pbtnode &rt)        //change at the night
     {
      pbtnode root=new btnode;
      pbtnode nd=new btnode;
      for(int i=0;i<m+1;i++)
      {
       root->chd[i]=0;
       nd->chd[i]=0;
      }
      //add
      int j;
      for(i=0,j=m/2+1;j<=m+1;j++,i++)
      {     //**
       if(rt->chd[j])                   //add in the night
        rt->chd[j]->pr=nd;
       nd->chd[i]=rt->chd[j];
      }

     
      root->pr=0;                          
      root->keynum=1;
      root->data[1]=rt->data[m/2+1];
      root->chd[0]=rt;
      root->chd[1]=nd;
      rt->pr=root;
      nd->pr=root;

      for(i=m/2+2,j=1;i<=m;i++,j++)
      {
       nd->data[j]=rt->data[i];
         
      }
      nd->chd[j]=rt->chd[i];
      rt->keynum=m/2;
      nd->keynum=m-rt->keynum-1;
      rt=root;
      //****************************************
     }

     //delete a key from the tree
     void del(int k)                     //do the 2-3 tree ,use this think to do the programm
     {
      deletebtree(root,k);
     }

     void deletebtree(pbtnode &rt,int k)
     {
      bool bl=false;
      pbtnode p,q=rt;
      searchBtree(q,k,p,bl);
      if(!bl)
      {
       cout<<"the node null in the tree!/n";
       return;
      }
      else
      {
       int i=search(p,k);
       if(!p->chd[i-1])        //whether have a dubeg for here!!
       {
        delnode(p,k);
       }
       else
       {
        int i=search(p,k);
        if(i<=p->keynum&&p->data[i]==k)        //hve dan change 11:12
         i=i;
        else
         i=i-1;
        pbtnode q,pp=p;
        p=p->chd[i];
        while(p)
        {
         q=p;
         p=p->chd[0];
        }
        int n=q->data[1];
        pp->data[i]=n;
        delnode(q,n);
       }
      }
     }

     void delnode(pbtnode &p,int k)
     {
      if(p->keynum>m/2)
      {
       int n=search(p,k);
       for(int i=n;i<p->keynum;i++)
       {
        p->data[i]=p->data[i+1];
        p->chd[i]=p->chd[i+1];
       }
       p->keynum--;
      }
      else
      {
       if(p->pr==0)
       {
        int n=search(p,k);
        for(int i=n;i<p->keynum;i++)
        {
         p->data[i]=p->data[i+1];
         p->chd[i]=p->chd[i+1];
        }
        p->keynum--;
        if(p->keynum==0)
        {
         for(i=0;i<=m;i++)
         {
          if(p->chd[i])
          p->chd[i]->pr=0;
         }
        // p=p->chd[0];
         root=p->chd[0];

        }
       }
       else
       {
        int j;
        pbtnode pr=p->pr,lb,rb;
    //    int j=search(pr,k)-1;
    //    /*
        j=search(pr,k);
        if(pr->data[j]!=k)
        j=j-1;
    //    */
        if(j==0)
         lb=0;
        else
         lb=pr->chd[j-1];
        if(j==pr->keynum)
         rb=0;
        else   
         rb=pr->chd[j+1];
        if(lb && (lb->keynum>m/2))
         lfbr(lb,pr,p,k);
        else if(rb && (rb->keynum>m/2))
         rtbr(p,pr,rb,k);
        else if(lb)
         lfconb(lb,pr,p,k);
        else if(rb)
         rtconb(p,pr,rb,k);
       }
      }
     }

     void lfbr(pbtnode &lb,pbtnode &pr,pbtnode &p ,int k)
     {
      int loc1=search(p,k);    //the k in the node location
      int loc2=search(pr,k)-1;   //the k may in the pr location
      //for the node p do the change .let the node have in the
      for(int i=loc1;i>=1;i--)
      {
       if(i>1)
       p->data[i]=p->data[i-1];
       if(p->chd[i-1])
        p->chd[i]=p->chd[i-1];
      }
      p->data[1]=pr->data[loc2];
      pr->data[loc2]=lb->data[lb->keynum];
      if(lb->chd[lb->keynum])
       lb->chd[lb->keynum]->pr=p;
      p->chd[0]=lb->chd[lb->keynum];
      lb->keynum--;
     }

     void lfconb(pbtnode &lb,pbtnode &pr,pbtnode &p ,int k)
     {
      int j;
      int loc1=search(p,k);    //the k in the node location
    //  int loc2=search(pr,k)-1;   //the k may in the pr location

    //  /*
      int loc2=search(pr,k);               //this the change of you will do
      if(pr->data[loc2]!=k)
       loc2=loc2-1;
    //  */
      //do the change for the node ,I am put the node's right child make null,so I will do like:
      for(int i=loc1;i<p->keynum;i++)
      {
       p->data[i]=p->data[i+1];
       p->chd[i]=p->chd[i+1];
      }   
      lb->data[lb->keynum+1]=pr->data[loc2];
      lb->chd[lb->keynum +1]=p->chd[0];
      if(p->chd[0])
      p->chd[0]->pr=lb;
      pr->chd[loc2]=0;                 //make null
      for(i=lb->keynum+2,j=1; i<=lb->keynum+p->keynum;i++,j++)
      {
       if(p->chd[j])
        p->chd[j]->pr=lb;
       lb->chd[i]=p->chd[j];
       lb->data[i]=p->data[j];
      }
      lb->keynum+=p->keynum;
      delnode(pr,pr->data[loc2]);
     }

     void rtbr(pbtnode &p,pbtnode &pr,pbtnode &rb,int k)
     {
      int loc1=search(p,k);    //the k in the node location
      int loc2=search(pr,k);   //the k may in the pr location,this is a not like for left change
      //change the node to can be insert
      for(int i=loc1;i<p->keynum;i++)
      {
       p->data[i]=p->data[i+1];
       p->chd[i]=p->chd[i+1];
      }
      p->chd[p->keynum]=rb->chd[0];
      if(rb->chd[0])
       rb->chd[0]->pr=p;
      p->data[p->keynum]=pr->data[loc2];
      pr->data[loc2]=rb->data[1];
      rb->chd[0]=rb->chd[1];
      for(i=1;i<rb->keynum;i++)
      {
       rb->chd[i]=rb->chd[i+1];
       rb->data[i]=rb->data[i+1];
      }
      rb->keynum--;
     }

     void rtconb(pbtnode &p,pbtnode &pr,pbtnode &rb,int k)
     {
      int i,j;
      int loc1=search(p,k);    //the k in the node location
      int loc2=search(pr,k);   //the k may in the pr location,this is a not like for lfconb change
      //change the node
      for(i=loc1;i<p->keynum;i++)
      {
       p->chd[i]=p->chd[i+1];
       p->data[i]=p->data[i+1];
      }
      p->data[p->keynum]=pr->data[loc2];
      p->chd[p->keynum]=rb->chd[0];
      if(rb->chd[0])
       rb->chd[0]->pr=p;
      pr->chd[loc2]=0;              //make null
      for(j=p->keynum+1,i=1;j<=p->keynum+rb->keynum;j++,i++)
      {
       p->data[j]=rb->data[i];
       if(rb->chd[i])
        rb->chd[i]->pr=p;
       p->chd[j]=rb->chd[i];
      }
      p->keynum+=rb->keynum; 
      delnode(pr,pr->data[loc2]);
     }


     
     //the node see

     void Inorder(pbtnode &rt)
     {
      if(!rt)return;
      for(int i=0;i<=rt->keynum;i++)
      {
       Inorder(rt->chd[i]);
       if(i<rt->keynum&&rt->data[i+1])
        cout<<rt->data[i+1]<<"   ";
      }
     }

     void print()
     {
      Inorder(root);
      cout<<"/nthe B_tree/n";
     }

    };

    void main()
    {
     int key,key1=0;
     key=0;
     btree bt;
     cout<<endl;
     bt.print();
                                               
     for(;;)
     {
     cout<<"enter the node with you want to delete/ncin>:";
     cin>>key>>key1;
    //for(int i=key;i<=key1;i++)
       for(int i=key;i>key1;i--)
     {
        if(i==8)
         bt.call();
    // bt.del(key);
      bt.del(i);
    //  cout<<"the btree delete:"<<key<<endl;
      cout<<"the btree delete:"<<i<<endl;
      bt.print(); 
     }
     }
    }

  • 相关阅读:
    EasyNVR平台使用Onvif探测设备时的操作注意事项
    视频平台EasyNVR更新版本后视频播放不了,识别不了js是什么原因?
    EasyNVR配置连接EasyNVS无法连接,报错timeout是什么原因?
    wNAF不相邻表示形式
    密码的前情知识
    64位编译器下基本数据类型所占字节数目
    gitlab禁止用户自己删除帐号
    Python中类创建和实例化过程 勿忘
    Qt5msvc2012编译安装
    kubuntu中ibus选词窗口不能正常弹出问题人解决办法
  • 原文地址:https://www.cnblogs.com/thubier/p/11944286.html
Copyright © 2020-2023  润新知