#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
//二叉排序树节点结构(二叉链表)
typedef struct BTNODE
{
int data;
struct BTNODE *lchild;
struct BTNODE *rchild;
}btnode,*btree;
//查找函数,采用递归调用该函数 *p为指向找到的元素,或最后一个元素,f非常巧妙应为*p 的终止为NULL而f则为其上一个节点指针,所以最后*p=f
int search(btree T,int n,btree f,btree *p)
{
if(!T)
{
*p=f;
return ERROR;
}
else if(T->data==n)
{
*p=T;
return OK;
}
else if(T->data>n)
return search(T->lchild,n,T,p);
else
return search(T->rchild,n,T,p);
}
//插入函数,如果查找不成功则吧该元素插入正确的位置
void insert(btree *T,int n)
{
btree p,s;
s=(btree)malloc(sizeof(btnode));
s->data=n;
s->lchild=s->rchild=NULL;
if(!(search(*T,n,NULL,&p)))
{
if(!p)
*T=s;
else if(p->data>n)
p->lchild=s;
else
p->rchild=s;
}
}
//建立二叉排序树的函数,就是一直查找,插入的过程
void creatree(btree *T)
{
int n;
*T=NULL;
scanf("%d",&n);
while(n!=0)
{
insert(T,n);
scanf("%d",&n);
}
}
//中序输出二叉排序树,用于检验是否建树成功
void inorder(btree T)
{
if(T)
{
inorder(T->lchild);
printf(" %d",T->data);
inorder(T->rchild);
}
}
//删除二叉排序树中的元素有4种情况
void Delete(btree *T,btree *parent)
{
btree p,s;
if(!(*T)->rchild&&!(*T)->lchild)//叶子节点的删除
{
if((*parent)->lchild==*T)
(*parent)->lchild=NULL;
else if((*parent)->rchild==*T)
(*parent)->rchild=NULL;
free(*T);
}
else if((*T)->rchild==NULL)//右子树为空
{
p=(*T)->lchild;
while(p->rchild)
p=p->rchild;
(*T)->data=p->data;
(*T)->lchild=p->lchild;
}
else if((*T)->lchild==NULL)//左子树为空
{
p=(*T)->rchild;
while(p->lchild)
p=p->lchild;
(*T)->data=p->data;
(*T)->rchild=p->rchild;
}
else if((*T)->lchild&&(*T)->rchild)//左右子树不空
{
p=*T;
s=(*T)->lchild;
while(s->rchild)
{
p=s;
s=s->rchild;
}
(*T)->data=s->data;
if(p!=(*T))
p->rchild=s->lchild;
else
p->lchild=s->lchild;
free(s);
}
}
void deleted(btree *T,btree *parent,int n)
{
if((*T)->data==n)
Delete(T,parent);
else
{
if((*T)->data>n)
deleted(&((*T)->lchild),T,n);
else
deleted(&((*T)->rchild),T,n);
}
}
void main()
{
int n;
btree T;
printf("please enter the data\n");
creatree(&T);
inorder(T);
printf("\nplease enter the data you want delet\n");
scanf("%d",&n);
deleted(&T,&T,n);
inorder(T);
}
二叉排序树的创建与删除
最新推荐文章于 2022-03-28 16:13:26 发布