版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40667484/article/details/80874512
typedef struct BiTNode
{
int data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}Bintree;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"list.h"
int BTSearch(Bintree *T,int key,Bintree *f,Bintree **p) //T代表树,f为T的双亲,初始为NULL,key查找的值, p指向查找路径上访问的最后一个节点并返回0 //查找操作
{
if(T==NULL) //查找不成功
{
*p=f;
return 0;
}
else if(key==T->data)
{
*p=T;
return 1;
}
else if(key<T->data)
{
return BTSearch(T->lchild,key,T,p);
}
else
{
return BTSearch(T->rchild,key,T,p);
}
}
#include<stdlib.h>
#include<string.h>
#include"list.h"
int BTSearch(Bintree *T,int key,Bintree *f,Bintree **p) //T代表树,f为T的双亲,初始为NULL,key查找的值, p指向查找路径上访问的最后一个节点并返回0 //查找操作
{
if(T==NULL) //查找不成功
{
*p=f;
return 0;
}
else if(key==T->data)
{
*p=T;
return 1;
}
else if(key<T->data)
{
return BTSearch(T->lchild,key,T,p);
}
else
{
return BTSearch(T->rchild,key,T,p);
}
}
int InsertBSTree(Bintree **T,int key) //插入操作
//每执行一次插入操作,T存储下来,f,p重置
{
Bintree *p,*s;
if(!BTSearch(*T,key,NULL,&p))
{
s=(Bintree *)malloc(sizeof(Bintree));
s->data=key;
s->lchild=s->rchild=NULL;
if(p==NULL)
*T=s;
else if(key<p->data)
p->lchild=s;
else
p->rchild=s;
return 1;
}
else
return 0;
}
int Delete(Bintree **p)
{
Bintree *q,*s;
if((*p)->rchild==NULL)
{
q=*p;
*p=(*p)->lchild;
free(q);
}
else if((*p)->lchild==NULL)
{
q=*p;
*p=(*p)->rchild;
free(q);
}
else
{
q=*p;
s=(*p)->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
(*p)->data=s->data;
if(q!=*p)
{
q->rchild=s->lchild;
}
else
{
q->lchild=s->lchild;
}
free(s);
}
return 1;
}
int DeleteBST(Bintree **T,int key)
{
if(*T==NULL)
{
return 0;
}
else
{
if(key==(*T)->data)
{
return Delete(T);
}
else if(key<(*T)->data)
{
return DeleteBST(&(*T)->lchild,key);
}
else
{
return DeleteBST(&(*T)->rchild,key);
}
}
}
{
Bintree *p,*s;
if(!BTSearch(*T,key,NULL,&p))
{
s=(Bintree *)malloc(sizeof(Bintree));
s->data=key;
s->lchild=s->rchild=NULL;
if(p==NULL)
*T=s;
else if(key<p->data)
p->lchild=s;
else
p->rchild=s;
return 1;
}
else
return 0;
}
int Delete(Bintree **p)
{
Bintree *q,*s;
if((*p)->rchild==NULL)
{
q=*p;
*p=(*p)->lchild;
free(q);
}
else if((*p)->lchild==NULL)
{
q=*p;
*p=(*p)->rchild;
free(q);
}
else
{
q=*p;
s=(*p)->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
(*p)->data=s->data;
if(q!=*p)
{
q->rchild=s->lchild;
}
else
{
q->lchild=s->lchild;
}
free(s);
}
return 1;
}
int DeleteBST(Bintree **T,int key)
{
if(*T==NULL)
{
return 0;
}
else
{
if(key==(*T)->data)
{
return Delete(T);
}
else if(key<(*T)->data)
{
return DeleteBST(&(*T)->lchild,key);
}
else
{
return DeleteBST(&(*T)->rchild,key);
}
}
}
void Display(Bintree *T) //显示
{
if(T)
{
printf("%d ",T->data);
Display(T->lchild);
Display(T->rchild);
}
}
{
if(T)
{
printf("%d ",T->data);
Display(T->lchild);
Display(T->rchild);
}
}
int main()
{
int i,n;
int key;
int a[10];
Bintree *T=NULL;
printf("输入n个数据\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
InsertBSTree(&T,a[i]); //T的话因为T在函数里的操作返回后内存释放掉 所以要传递地址
}
printf("请输入要删除的值\n");
scanf("%d",&key);
DeleteBST(&T,key);
Display(T);
return 0;
}
{
int i,n;
int key;
int a[10];
Bintree *T=NULL;
printf("输入n个数据\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
InsertBSTree(&T,a[i]); //T的话因为T在函数里的操作返回后内存释放掉 所以要传递地址
}
printf("请输入要删除的值\n");
scanf("%d",&key);
DeleteBST(&T,key);
Display(T);
return 0;
}
本样例建议断点跟踪查看二叉排序树结构