二叉排序树的创建与删除

#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);	
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值