#include<iostream>
using namespace std;
typedef int datatype;
typedef struct node
{
datatype key;
struct node *lchild,*rchild;
}bsnode; // 二叉排序树
typedef bsnode* bstree;
bstree bssearch(bstree t, datatype x)
{
// 非递归
bstree p = t;
while(p)
{
if(x == p->key) return p;
p = (x<p->key) ? p->lchild : p->rchild ;
}
return NULL ;
}
bstree bssearch2( bstree t, datatype x)
{
//递归
if(t == NULL || x == t->key) return t;
if(x<t->key) return bssearch2(t->lchild,x) ;
else return bssearch2(t->rchild,x) ;
}
void InsertBstree( bstree * t /* 二级指针*/, datatype x)
{
bstree f,p; // f用于保存新节点的最新插入位置前驱
p=*t;
while(p)
{
if(x == p->key) return ;// 若二叉树t中已有x ,则无需插入
f=p;
p= ( x<p->key ) ? p->lchild : p->rchild;
}
p = (bstree) malloc (sizeof(bsnode));
p->key = x;
p->lchild=p->rchild=NULL;
if(*t == NULL ) *t=p; //原树为空
else if(x<f->key) f->lchild=p;
else f->rchild=p;
}
bstree CreatBstree(int r[], int n)
{
int i;
bstree t=NULL;
for(int i=0;i<n;i++)
InsertBstree(&t , r[i]);
return t;
}
void bssearch1(bstree t,datatype x,bstree *f,bstree *p){/*非递归查找*/
*f=NULL;//记录父结点
*p=t;
while(*p){
if(x==(*p)->key)
return ;
*f=*p;
*p=(x<(*p)->key?(*p)->lchild:(*p)->rchild);
}
return ;
}
void mid_print(bstree t)
{
if(t)
{
mid_print(t->lchild);
printf("%d ",t->key);
mid_print(t->rchild);
}
}
bstree DelBstree(bstree t,datatype x){//删除
bstree p,q,child;
bssearch1(t,x,&p,&q);//查找
if(q){
if(q->lchild==NULL && q->rchild==NULL){//叶结点
if(p){
if(p->lchild==q)
p->lchild=NULL;
else
p->rchild=NULL;
}
else
t=NULL;//如果q为根结点,t为空
free(q);//删除后,释放q
}
else if(q->rchild==NULL){//q的右孩子为空
if(p){
if(p->lchild==q)
p->lchild=q->lchild;
else
p->rchild=q->lchild;
}
else
t=q->lchild;
free(q);
}
else if(q->lchild==NULL){//q的左孩子为空
if(p){
if(p->lchild==q)
p->lchild=q->rchild;
else
p->rchild=q->rchild;
}
else
t=q->rchild;
free(q);
}
else{//q的左孩子、右孩子均不为空
child=q->rchild;
while(child->lchild)
child=child->lchild;//相当于找到q的直接后继
child->lchild=q->lchild;
if(p){
if(p->lchild==q)
p->lchild=q->rchild;
else
p->rchild=q->rchild;
}
else
t=q->rchild;
free(q);
}
}
return t;
}
int main(){
int arr[]={99,3,2,4,5,2,9,0,5,14,5243,64,67,324,5145};
bstree t=CreatBstree(arr,15);
mid_print(t);
cout<<endl;
t=DelBstree(t,66);
mid_print(t);
return 0;
}
原文:https://www.cnblogs.com/lkfsblogs/p/12976833.html