二叉排序树
给出一个数据序列,建立二叉排序树,并实现删除功能对二叉排序树进行中序遍历,可以得到有序的数据序列
#include <iostream>
using namespace std;
#define Maxsize 25
struct BiNode{
int data;
struct BiNode *lchild,*rchild;
};
struct BiNode *root;
int BisCount;
int BisPos;
int BisSuccess;
BiNode *NextBiNode;BiNode *q;BiNode *l;
void InsertNode(BiNode *root,BiNode *s)
{
if(s->data<root->data)
{
if(!root->lchild==NULL)
InsertNode(root->lchild,s);
else
{
root->lchild=s;
return;
}
}
else
{
if(!root->rchild==NULL)
InsertNode(root->rchild,s);
else
{
root->rchild=s;
return;
}
}
}
void CreateBST(int *r,int n)
{
int i;
BiNode *s;
root->data=r[0];
root->lchild=root->rchild=NULL;
for(i=1;i<n;i++)
{
s=new BiNode;
s->data=r[i];
s->lchild=s->rchild=NULL;
InsertNode(root,s);
}
}
BiNode *SearchNode(BiNode *root,int k)
{
BisCount++;
if(root->data==k)
{
BisSuccess=1;
return root;
}
else
{
if(root->data>k)
{
BisPos=2*BisPos-1;
NextBiNode=root->lchild;
}
if(root->data<k)
{
BisPos=2*BisPos;
NextBiNode=root->rchild;
}
}
if(NextBiNode !=NULL)
return SearchNode(NextBiNode,k);
else
{
BisSuccess=0;
BisCount++;
BiNode *s;s=new BiNode;
s->data=k;
s->lchild=s->rchild=NULL;
InsertNode(root,s);
return NULL;
}
}
int DeleteNode(BiNode* &p)
{
if(!p->rchild)
{
q=p;
p=p->lchild;
delete q;
}
else if(!p->lchild)
{
q=p;
p=p->rchild;
delete q;
}
else
{
q=p;l=p->lchild;
while(l->rchild)
{
q=l;
l=l->rchild;
}
p->data=l->data;
if(q!=p)
q->rchild=l->lchild;
else
q->lchild=l->lchild;
delete l;
}
return 1;
}
void InOrder(BiNode *bt)
{
if(bt==NULL)
return;
else{
InOrder(bt ->lchild);
cout<<bt->data<<" ";
InOrder(bt ->rchild);
}
}
int SearchBST(int k)
{
BisCount=0;
BisPos=1;
if(root->data==NULL)
{
BisSuccess=0;
return 0;
}
SearchNode(root,k);
return BisSuccess;
}
int DeleteBST(BiNode* root,int k)
{
if(!root)
return 0;
else
{
if(root->data==k)
return DeleteNode(root);
else if(k<root->data)
return DeleteBST(root->lchild,k);
else
return DeleteBST(root->rchild,k);
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,i,m,k;
int a[20];
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
root=new BiNode;
CreateBST(a,n);
InOrder(root);
cout<<endl;
cin>>m;
for(i=0;i<m;i++)
{
cin>>k;
DeleteBST(root,k);
InOrder(root);
cout<<endl;
}
}
return 0;
}
肯定是delete这一部分出问题了
调试的时候卡在了中序遍历那 貌似是删除后的节点有残留一样的 然后排序就出错了;
ps:试着输入22 33 55 66 11 44 中序遍历的结果是11 22 33 44 55 66;
求大神帮我看看delete那一部分哪里出问题 我实在是找不出错误在哪里!