二叉排序树学习笔记

二叉排序树的定义:

  1. 左子树不为空时,则左子树上所有结点的值都小于它的根结点的值
  2. 右子树不为空时,则右子树上所有结点的值都大于它的根结点的值
  3. 它的左右字数也分别为二叉排序树(递归)

代码:

#include<stdio.h>
#include<stdlib.h>

typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//查找操作(递归实现)
/*
   T是二叉查找树,key是要查找的值,
   f是指向T的双亲,其初始值为NULL
   p指向查找路径中访问的最后一个结点
*/
int Search(BiTree T,int key,BiTree f,BiTree *p)
{
	if(NULL==T)
	{
		*p=f;
		return 0;   //没找到
	}
	if(key==T->data)
	{
		*p=T;
		return 1;  //找到了
	}
	if(key>T->data)
	{
		Search(T->rchild,key,T,p);
	}
	if(key<T->data)
	{
		Search(T->lchild,key,T,p);
	}
 
}

//插入操作
int insert(BiTree *T,int key)
{
	BiTree p,s;
	if(Search(*T,key,NULL,&p))
	{
		return 0;   //T中已经存在key了
	}
	else
	{
		s=(BiTree)malloc(sizeof(BiTNode));
		s->data=key;
		s->lchild=NULL;
		s->rchild=NULL;
		if(!p)         //如果p是空就证明T是空的,所以让s成为根节点了
		{
			*T=s;
		}
		else if(key>p->data)    //因为p是搜索的指向最后的一个结点,也就是离key要插入的位置最近的那一个结点
		{
			p->rchild=s;
		}
		else
		{
			p->lchild=s;
		}
		return 1;

	}
}

//删除操作
int Delete(BiTree *T)
{
	BiTree q,s;
	if((*T)->lchild==NULL)
	{
		q=*T;
		*T=(*T)->rchild;
		free(q);
	}
	else if((*T)->rchild==NULL)
	{
		q=*T;
		*T=(*T)->lchild;
		free(q);
	}
	else
	{
		q=*T;
		s=(*T)->lchild;
		while(s->rchild)   //找要删除的前驱结点,也就是要删除的结点里面最大的那个
		{
			q=s;
			s=s->rchild;
		}
		(*T)->data=s->data;
		if(q!=*T)
		{
			q->rchild=s->lchild;

		}
		else             //当q和*T相等时,就证明T的前驱结点就是他的左边那个,也就是他左边那个没有右子树
		{
			q->lchild=s->lchild;

		}
		free(s);

	}
	return 1;
}

int DeleteBiT(BiTree *T,int key)
{
	if(!T)         //不存在key或者T是空的
	{
		return 0;
	}
	else
	{
		if(key==(*T)->data)
		{
			Delete(T);
		}
		else if(key>(*T)->data)
		{
			DeleteBiT(&(*T)->rchild,key);
		}
		else
		{
			DeleteBiT(&(*T)->lchild,key);
		}
	}
}

int main()
{
	int array[]={46,67,70,105,100,99,103,104,115,110,108,112};
	int i;
	BiTree T=NULL,p;
	int a,b,c;
	for(i=0;i<12;i++)
	{
  
		insert(&T,array[i]);
	}
	printf("输入要查找的数,要插入的数,要删除的数:\n");
	scanf("%d %d %d",&a,&b,&c);
	Search(T,a,NULL,&p);
	insert(&T,b);
	DeleteBiT(&T,c);

	return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值