为什么二叉排序树的查找操作能实现,但删除操作有问题
#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 编辑 ]