二叉排序树(Binary Search Tree)

二叉排序树的定义

二叉排序树,又称二叉查找树,我们这样定义:树非空,对于任意结点存在左子树或右子树,则左子树上所有结点的关键字均小于该结点的关键字,右子树上所有结点的关键字均大于该节点的关键字,这样的二叉树叫二叉排序树。即:

左子树结点值<根结点值<右子树结点值

还有一个默认规定,在二叉排序树中,不能有两个结点关键字相同。

二叉排序树的查找

定义一个二叉树的结构:

typedef struct BSTNode {
   
	int data;
	struct BSTNode* lchild;
	struct BSTNode* rchild;
}BSTNode,* BSTree;

查找算法的基本思路是,从根节点开始,目标值更小的往左找,目标值更达的往右找,知道目标值和结点值相同,返回该结点。通过递归的方式实现:

BSTNode* Search(BSTree T, int k) {
   
	if (T == NULL)
		return NULL;
	if (k == T->data)
		return T;
	else if (k < T->data)
		return Search(T->lchild, k);
	else 
		return Search(T->rchild, k);
}

二叉排序树的插入

插入算法的设计思路与查找类似,采用递归的方式,将待插入结点的关键字值与树中各个结点的关键字值进行比较,若小于则向左走,若大于则向右走,知道找到一个空结点,将新结点插入。从算法的实现方式上,我们可以知道,插入结点一定都是叶子结点。下面是算法实现:

Status BST_Insert(BSTree* T, int k) {
   
	if ((*T) == NULL) {
   
		(*T) = (BSTree)malloc(sizeof(BSTNode));
		if (!(*T))exit(OVERFLOW);
		(*T)->data = k;
		(*T)->lchild = (*T)->rchild = NULL;
		return OK;//插入成功
	}
	else if (k == (*T)->data)return ERROR;//插入失败
	else if (k < (*T)->data)return BST_Insert(&(*T)->lchild, k);
	else return BST_Insert(&(*T)->rchild, k);
}

二叉排序树的删除

删除算法的实现较为复杂,主要需要考虑结点的类型,来分门别类进行讨论。首先分析,一个结点会有三种情况:

1.该结点是叶子结点,那么可以直接删除;

2.结点只含有左子树或右子树,在删除该节点后,用其子树代替其在原先的位置;

3.结点既含有左子树,有含有右子树,这里有两种处理方法。在待删除结点的位置,可以用待删除结点的后继结点来替代,然后删除后继结点;或者是用待删除的结点的前驱结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值