二叉查找树

二叉查找树(二叉搜索树)是二叉树中最常用的一种类型。
它不仅仅支持快速查找一个数据,还支持快速插入、删除一个数据。这都依赖于二叉查找树的特殊结构:
它要求在树的任意一个节点,其左子树的每个节点的值都要小于这个节点的值,而右子树节点的值都应大于这个节点的值。如下图所示:
在这里插入图片描述二叉查找树的查找操作
在这里插入图片描述

  1. 我们先取根节点,如果它等于我们要查找的数据,那就返回。
  2. 如果要查找的数据比根节点的值小,那就在左子树中递归查找。
  3. 如果要查找的数据比根节点的值大,那就在右子树中递归查找。

二叉查找树的插入操作
在这里插入图片描述
插入的过程有点类似查找操作,新插入的数据一般都是在叶子节点上,所以只需要从根节点开始,依次比较要插入的数据和节点的大小关系。

  1. 若要插入的数据比节点数据大,并且节点的右子树为空,就将新数据直接插入到右子节点的位置;如果不为空,就再递归遍历右子树,查找插入位置。
  2. 同理,若要插入的数据比节点数值小,并且节点的左子树为空,就将新数据插入到左子节点的位置;如果不为空,就再递归遍历左子树,查找插入位置。

二叉树的删除操作
在这里插入图片描述
针对要删除节点的子节点个树的不同,分为三种情况:

  1. 如果要删除的节点没有子节点,我们只需要直接将父节点中指向要删除节点的指针置为null。比如删除图中的节点55。
  2. 如果要删除的节点只有一个子节点,我们只需要更新父节点中指向要删除节点的指针,让它指向要删除节点的子节点就可以了。比如删除图中的节点33。
  3. 如果要删除的节点有两个子节点,这时我们需要找到这个节点的右子树中的最小节点,把它替换到要删除的节点上,然后再删除这个最小节点。比如删除图中的节点18。

二叉查找树的其他操作
比如:快速地查找最大节点和最小节点、前驱节点和后继节点。
中序遍历二叉查找树,可以输出有序的数据序列,时间复杂度是O(n),非常高效。

支持重复数据的二叉查找树
如果存储的两个对象键值相同,该如何处理呢?

  1. 第一种方法比较容易。二叉查找树中每一个节点不仅仅存储一个数据,我们通过链表和支持动态扩容的数组等数据结构,把值相同的数据都存储在同一个节点上。
  2. 第二种方法是,每个节点仍然只存储一个数据。在查找插入位置的过程中,如果碰到一个节点与要插入数据的值相同,我们就将这个要插入的数据放到这个节点的右子树,即把这个新插入的数据当作大于这个节点的值来处理;
    当要查找数据的时候,遇到值相同的节点,我们并不停止查找操作,而是继续在右子树中查找,直到遇到叶子节点,才停止,这样就可以把键值等于要查找值的所有节点都找出来。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

二叉查找树不管是插入、删除还是查找操作,时间复杂度都跟树的高度成正比,即O(height)。
那么,如何求一棵包含n个节点的完全二叉树的高度?
h <=log以2为底n的对数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值