标题:为什么二叉排序树的查找操作能实现,但删除操作有问题
只看楼主
刘潘敏
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2012-10-17
结帖率:75%
已结贴  问题点数:10 回复次数:2 
为什么二叉排序树的查找操作能实现,但删除操作有问题
#include
template
struct BiNode
{
    T data;
    BiNode *lchild,*rchild;
};
template
class BiSortTree
{
public:
    BiSortTree(T a[],int n);
    ~BiSortTree()
    {
    }
   void InsertBST(BiNode *&root,BiNode *s);
    void DeleteBST(BiNode *p,BiNode *f);
    BiNode * SearchBST(BiNode *root,T k);
    BiNode * SearchBST1(BiNode *root,T K);
      BiNode * getroot();
      void InOrder(BiNode *root);
private:
 BiNode  *root;
};
  template
     BiNode * BiSortTree::getroot()
{
    return  root;
  }
//二叉树的插入
  template
void BiSortTree::InsertBST(BiNode *&root,BiNode*s)
{

    if(root==NULL)
        root=s;
    else  if(s->datadata)
        InsertBST(root->lchild,s);
    else
         InsertBST(root->rchild,s);
   
}
   template
BiSortTree::BiSortTree(T a[],int n)
{
    root=NULL;
       for(int i=0;i *s=new BiNode;
        s->data=a[i];
        s->lchild=s->rchild=NULL;
        InsertBST(root,s);
    }
            

}
//二叉树排序树查找
template
BiNode* BiSortTree::SearchBST(BiNode  *root,T k)
{
    if(root==NULL)
        return NULL;
    else if(k==root->data)
        return root;
else if(kdata)

return    SearchBST(root->lchild,k);
   else return SearchBST(root->rchild,k);

}
template
BiNode * BiSortTree::SearchBST1(BiNode  *root,T k)
{
    if (root == NULL)
            return NULL;
        else if(root->lchild->data == k || root->rchild->data == k)
            return root;
        else if (k < root->data)
            return SearchBST1(root->lchild, k);
        else
            return     SearchBST1(root->rchild, k);


}

//二叉排序树删除

template
 void  BiSortTree::DeleteBST(BiNode *p,BiNode *f)
{
    if(!p->lchild&&!p->lchild)
        f->lchild=NULL;
  else if(!p->rchild)
        f->lchild=p->lchild;
  else if(!p->lchild)
      f->lchild=p->lchild;
  else
  {
      BiNode *q=p;
      BiNode *s=p->rchild;
      while(s->lchild)
      {
          q=s;
          s=s->lchild;
      }
      p->data=s->data;
      if(q==p)
          q->rchild=s->rchild;
      else
      q->lchild=s->rchild;
      delete s;
  }
}
  //二叉排序树中序遍历
template
   void BiSortTree::InOrder(BiNode *root)
   {
       if(root==NULL)
           return;
       else
       {
           InOrder(root->lchild);
               cout<data<<"  ";
           InOrder(root->rchild);
       }
   }



  void main()
  {
      int a[13]={100, 80, 110, 60, 102, 130, 40,50, 140 ,45, 30, 46, 47 };
      int k;
      int y=1;
          BiNode *ww,*p,*f;
      for(int i=0;i<13;i++)
          cout< ss(a,13);
        while(y==1)
        {
        cout<<"输入要查找的值"<<endl;
        cin>>k;
        
    ww= ss.SearchBST(ss.getroot(),k);
        if( ww!=NULL)
        cout <<"嘿嘿,恭喜你找到了"<<endl;
            else
            cout<<"对不起,没有你要找的值"<<endl;
        cin>> y;
        }
   
        cout<<"请输入你要删除的数值"<<endl;
        int b;
        cin>>b;
        if(ss.getroot()->data ==b)
        {
            p=ss.getroot();
            f=NULL;
        }
        else
        
        {
         p=ss.SearchBST(ss.getroot(),k);            
            
            f=ss.SearchBST1(ss.getroot(),k);
              

        }
        ss.DeleteBST(p,f);
        ss.InOrder(ss.getroot());
        }
   
        
        
 

[ 本帖最后由 刘潘敏 于 2012-12-8 18:10 编辑 ]
搜索更多相关主题的帖子: public include private void 
2012-12-08 18:08
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6809
专家分:42393
注 册:2010-12-16
得分:10 
if(!p->lchild&&!p->lchild)
         f->lchild=NULL;
   else if(!p->rchild)
         f->lchild=p->lchild;
   else if(!p->lchild)
       f->lchild=p->lchild;
   else
   {

这是什么逻辑?

我行我乐
我的博客:
http://blog.yuccn. net
2012-12-08 18:18
刘潘敏
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2012-10-17
得分:0 
就是说删除结点f的子树p
2012-12-08 23:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-390192-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050877 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved