js遍历树节点下的所有子节点_数据结构 | 二叉查找树

本文根据网上资料和自己学习所得整理而成,思维导图如下,希望对你有用。

3e4023e80d7d7f6bc4f39473417b5e22.png

1 定义

二叉查找树是二叉树中最常用的一种类型,也叫二叉搜索树。它支持快速的查找,插入,删除一个数据。做到这些,依赖于它特殊的结构。二叉查找树的结构是这样的,在树中任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树的值都大于这个节点的值。简单来说,就是对任意一个节点,左右子树满足左小右大的特点。

78f41c328bad7a0b643623a95b612878.png
二叉查找树

2 二叉查找树的查找操作

在二叉查找树中查找一个节点的逻辑是这样的

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

3 二叉查找树的插入操作

在二叉查找树中插入一个节点的逻辑是这样的

从根节点开始,依次比较要插入的数据和节点的大小关系
如果要插入的数据比节点数据大,并且节点的右子树为空,就将新数据直接插到右子节点的位置; 如果不为空,再递归遍历右子树,查找插入位置
和上面类似的逻辑,如果要插入的数据比节点数据小,并且节点的左子树为空,就将新数据直接插到左子节点的位置; 如果不为空,再递归遍历左子树,查找插入位置

4 二叉查找树的删除操作

删除一个节点,要根据被删除节点子节点个数的不同,分成三种情况处理

1 如果要删除的节点没有子节点,我们只需要将被删除节点的父节点,指向被删除节点的指针置为null就可以了
2 如果要删除的节点只有一个子节点(只有左子节点或者右子节点),只需要更新父节点中,指向要删除节点的指针,让它指向要删除节点的子节点就可以了
3 如果要删除节点有两个子节点,我们需要找到这个节点的右子树中的最小节点,把它替换到要删除的节点上。然后再删除掉这个最小节点,因为最小节点肯定没有左子节点(如果有左子结点,那就不是最小节点了)

f68d6ba1350668969bbebfea7ad408f6.png
二叉查找树的三种删除情况,分别删除 55 13 18

除了上面的方法外,还有一个简单的删除操作,就是只是将要删除的节点标记为“已删除”,但是并不真正进行删除操作。采用这种方法,原来要删除的节点还是存在内存中,有点浪费内存空间。但是这样做逻辑上比较简单,对插入,查找操作也没有太大的影响。

5 中序遍历二叉查找树

中序遍历二叉查找树可以输出有序的数据序列,时间复杂度是O(n),非常高效。

6 二叉查找树的其他操作

二叉查找树中还可以支持快速地查找最大节点和最小节点、前驱节点和后继节点。

7 支持重复数据的二叉查找树

在实际开发中,我们是利用对象的某个字段作为健值来构建二叉查找树,对象中的其他字段叫做卫星数据。

如果遇到两个健值相同的对象,二叉树是怎么存储的呢?

有两种方法。一种是通过链表或者支持动态扩容的数组等数据结构,把值相同的数据都存储在同一个节点上。

另外一种方法是每个节点仍然只存储一个数据。如果在插入过程中,遇到一个节点的值和要插入的值相同,那么我们就把要插入的值放到这个节点的右子树。

1f7a6a444d2348fc1c142dbb13be3596.png
插入健相同的元素

就是把这个值当作大于这个节点的值来处理。当查找数据时,遇到值相同的节点,不停止查找,而是继续在右子树中查找,直到遇到叶子节点,才停止。这样就可以把健值等于要查找值的所有节点都找出来。

755e306ee266be252bc3e5155d2f7bdf.png
查找健相同的元素

删除操作和查找操作一样,也就是找到所有要删除的节点之后,然后按照前面的方法进行删除。

a2a0025502f38eb0fa2122989afb6e4a.png
删除健相同的元素

8 二叉查找树的时间复杂度分析

最糟糕的情况下,当二叉查找树左右子树极度不平衡,退化为链表时候,时间复杂度就变为了O(n)

最好情况下,当二叉查找树是一棵完全二叉树或者满二叉树时,时间复杂度和树的高度成正比,也就是O(高度)。而完全二叉树的高度小于等于 log2n(n为节点个数)。所以最好情况下,二叉查找树的时间复杂度为O(logn)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值