二叉排序树

二叉排序树(Binary Sort Tree)又称为二叉查找树,中序二叉排序树得到有序列表,它或者是一棵空树,或者是具有下列性质的二叉树:

若它的左子树不为空,则左子树所有节点的值均小于它的根结构的值。

若它的右子树不为空,则右子树所有节点的值均大于它的根结构的值。

它的左右子树也分别为二叉排序树(递归)。

二叉排序树的查找操作:

//二叉排序树结点结构定义
typedef struct BiTNode
{
	int data ;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

//递归查找二叉排序树T中是否存在key
//指针f指向T的双亲,其初始值为NULL
//若查找成功,则指针p指向数据元素节点,并返回true
//否则指针p指向查找路径上访问的最后一个节点
Status SearchBST(BiTree T, int key, BiTree f, BiTree *p)
{
	if(!T)	//查找不成功
	{
		*p = f;
		return FALSE;
	}
	else if (key == T->data) //查找成功
	{
		*p = T;
		return true;
	} else if (key < T->data) //在左子树查找
	{
		return SearchBST(T->lchild, key, T, p);
	}
	else {
		return SearchBST(T->rchild, key, T, p); //在右子树查找
	}
}
//二叉排序树插入操作
//当二叉排序树T中不存在关键字等于key的数据元素
//插入key返回TRUE,否则返回FALSE
Status InsertBST (BiTree *T, int key) 
{
	BiTree p, s;
	if(!SearchBST(T, key, NULL, &p))
	{
		s = (BiTree)malloc(sizeof(BiTree));
		s->key = key;
		s->lchild = s->rchild = NULL;

		if(!p)
			*T = s;       //插入s为新的根节点
		else if (p->data > key)
		{
			p->rchild = s;  //插入s为右孩子
		}
		else 
			p->lchild = s;  //插入s为左孩子
		return true;
	}else {
		return false;		//树中有相同节点不在插入
	}
}
//二叉排序树的删除
Status Delete(BiTree *p)
{
	BiTree s, q;   //q待删除的上一个节点,双亲节点,s每一次迭代用到的节点
	if(NULL == p->rchild) //左子树为空,右子树接过去
	{
		q = *p;
		*p = (*p)->lchild;
		free(q);
	}
	else if(NULL == p->lchild) //右子树为空,左子树接过去
	{
		q = *p;
		*p = (*p)->rchild;
		free(q);
	}
	else {	//左、右子树非空,将直接前驱的左子树做为直接前驱的双亲
		q = *p;
		s = (*p)->lchild;

		while(s->lchild) //循环迭代找到直接前驱(左子树最右的那一棵树)
		{
			q = s;
			s = s->lchild;  //每次s的右子树直到为NULL
		}
		(*p)->data = q->data;	//替换数据
		if(q != *p)
		{
			q->rchild = s->lchild;
		}else {
			q->lchild = s->lchild;
		}
		free(s);
	}
	return TRUE;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值