#include <iostream
>
using namespace std;
#include<cstdio
>
#include<cstdlib
>
typedef struct node
{
int key;
struct node
*lchild,
*rchild;
node():key(int()),lchild(
NULL),rchild(
NULL) {}
} BSTree;
BSTree
*BSTSearch(BSTree
*t,int k)
{
while(t
!=NULL)
{
if(k
==t
->key)
return t;
else if(t
->key
>k)
t
=t
->lchild;
else
t
=t
->rchild;
}
return NULL;
}
void BSTCreat(BSTree
**t,int k)
{
BSTree
*p,
*q;
q
=*t;
p
=NULL;
while(q
!=NULL)
{
if(k
==q
->key)
goto L1;
else if(k
<q
->key)
{
p
=q;
q
=q
->lchild;
}
else
{
p
=q;
q
=q
->rchild;
}
}
if(
*t
==NULL)
{
q
=(BSTree
*)malloc(sizeof(BSTree));
q
->key
=k;
q
->rchild
=NULL;
q
->lchild
=NULL;
*t
=q;
}
else
{
q
=(BSTree
*)malloc(sizeof(BSTree));
q
->key
=k;
q
->rchild
=NULL;
q
->lchild
=NULL;
}
if(p
!=NULL)
{
if(p
->key
>k)
p
->lchild
=q;
else
p
->rchild
=q;
}
L1:
;
}
void BSTDelete(BSTree
**t,int k)
{
BSTree
*p,
*q,
*r;
q
=*t;
p
=*t;
if(q
==NULL)
goto L2;
if(q
->lchild
==NULL &&q
->rchild
==NULL&&q
->key
==k)
{
q
=NULL;
goto L2;
}
while(q
!=NULL)
{
if(k
==q
->key)
goto L1;
else if(k
<q
->key)
{
p
=q;
q
=q
->lchild;
}
else
{
p
=q;
q
=q
->rchild;
}
}
if(q
==NULL)
goto L2;
L1:
if(q
->lchild
==NULL&&q
->rchild
==NULL)
{
if(p
->lchild
==q)
p
->lchild
=NULL;
else
p
->rchild
=NULL;
free(q);
}
else if(q
->lchild
==NULL)
{
if(p
->lchild
==q)
p
->lchild
=q
->rchild;
else
p
->rchild
=q
->rchild;
free(q);
}
else if(q
->rchild
==NULL)
{
if(p
->lchild
==q)
p
->lchild
=q
->lchild;
else
p
->rchild
=q
->lchild;
free(q);
}
else
{
r
=q
->rchild;
if(r
->lchild
==NULL&&r
->rchild
==NULL)
{
q
->key
=r
->key;
q
->rchild
=NULL;
}
else
{
p
=q;
while(r
->lchild
!=NULL)
{
p
=r;
r
=r
->lchild;
}
q
->key
=r
->key;
if(p
->lchild
==r)
p
->lchild
=r
->rchild;
else
p
->rchild
=r
->rchild;
}
free(r);
}
L2:
;
}
void print(BSTree
*t)
{
if(t
!=NULL)
{
print(t
->lchild);
cout
<<t
->key
<<" ";
print(t
->rchild);
}
}
int main()
{
int a
[]= {5,4,8,6,3,2,0,9,1};
BSTree *t=NULL;
for(unsigned i=0; i<sizeof(a)/sizeof(int); i++)
BSTCreat(&t,a[i
]);
print(t);
BSTree *d=BSTSearch(t,2);
BSTDelete(&t,d->key);
return 0;
}
遇到的问题:在写这个函数BSTCreat(BSTree **t,int k) 时候,书上是针对非空二叉树的插入,传递的是一级指针,我想着是空树也可以插入作为根节点,如果不改代码就会出现段错误,后来改成了传递二级指针,发现可以解决,但是对传递二级指针理解还是不是很深刻。