求二叉搜索树任一节点的前驱后继节点

二叉搜索树节点的前驱后继节点

之前写过文章介绍了二叉搜索树以及其上的基本操作,但不包括求节点的前驱结点和后继节点。

这是一个很老的问题了,首先看下某节点前驱和后继节点的定义。一个节点的
前驱结点:节点val值小于该节点val值并且值最大的节点
后继节点:节点val值大于该节点val值并且值最小的节点

算法导论中给出了详细的求前驱结点和后继节点的算法,但是其中的节点数据结构包含了指向父亲节点的指针,但是一般的给出的节点不包含父亲指针,这就加大了就前驱节点和后继节点的难度。

本文在不含父指针的节点数据结构下,分析给出了时间复杂度为O(lgN)的求前驱后继结点的算法。


例子

树节点的依旧定义如下(我们的基本树节点没有指向父节点的指针):

struct TreeNode {
      int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  };

给出一个二叉树如下图:

这里写图片描述

二叉树的节点val值是按照二叉树中序遍历顺序连续设定。

前驱结点

  • 如图4的前驱结点是3
  • 2的前驱结点是1
  • 6的前驱结点是5

后继节点

  • 7的后继结点是8
  • 5的后继节点是6
  • 2的后继节点是3

规则

根据上述例子,我们可以得到下述规则:

前驱节点

  1. 若一个节点有左子树,那么该节点的前驱节点是其左子树中val值最大的节点(也就是左子树中所谓的rightMostNode)
  2. 若一个节点没有左子树,那么判断该节点和其父节点的关系
    2.1 若该节点是其父节点的右边孩子,那么该节点的前驱结点即为其父节点。
    2.2 若该节点是其父节点的左边孩子,那么需要沿着其父亲节点一直向树的顶端寻找,直到找到一个节点P,P节点是其父节点Q的右边孩子(可参考例子2的前驱结点是1),那么Q就是该节点的后继节点

类似,我么可以得到求后继节点的规则。

后继节点

  1. 若一个节点有右子树,那么该节点的后继节点是其右子树中val值最小的节点(也就是右子树中所谓的leftMostNode)
  2. 若一个节点没有右子树,那么判断该节点和其父节点的关系
    2.1 若该节点是其父节点的左边孩子,那么该节点的后继结点即为其父节点
    2.2 若该节点是其父节点的右边孩子,那么需要沿着其父亲节点一直向树的顶端寻找,直到找到一个节点P,P节点是其父节点Q的左边孩子(可参考例子2的前驱结点是1),那么Q就是该节点的后继节点

实现

求前驱节点

规则中我们是从下往上找,但实际代码中是

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 红黑树是一种自平衡的二搜索树,它的每个节点都有一个颜色,红色或黑色。它具有以下几种特性:1)每个节点要么是红色,要么是黑色;2)根节点是黑色;3)每个叶节点(叶节点即指树尾端的空节点)都是黑色;4)如果一个节点是红色,那么它的子节点都是黑色;5)从任一节点到其每个叶节点的所有路径都包含相同数目的黑色节点。二搜索树是一种内部节点存储了一个关键字的二树,其中的每个节点都有两个子节点,左子节点和右子节点,它们分别小于或大于其父节点的关键字。两者的最大差别在于红黑树是自平衡的,而二搜索树不是。 ### 回答2: 红黑树和二搜索树是常见的数据结构,用于实现有序的动态集合。它们的差别主要体现在以下几个方面: 1. 平衡性:红黑树是一种自平衡的二搜索树,在插入或删除元素后能够通过旋转和颜色调整来保持树的平衡,从而保证了树的高度始终保持在O(log n)水平。而二搜索树的平衡性取决于插入顺序,如果插入顺序不合理,可能会导致树的高度接近于线性,时间复杂度变为O(n)。 2. 插入和删除操作的复杂度:红黑树的插入和删除操作都能在O(log n)的时间复杂度内完成,因为它会通过旋转和颜色调整来保持树的平衡。而二搜索树的插入和删除操作的时间复杂度与树的结构有关,最坏情况下可能需要O(n)的时间复杂度。 3. 树的性质:红黑树是一种平衡二搜索树,并且具有以下性质: (1) 每个节点要么是红色,要么是黑色。 (2) 根节点是黑色。 (3) 每个叶子节点(NIL节点,空节点)是黑色。 (4) 如果一个节点是红色,则它的两个子节点都是黑色。 (5) 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,包含相同数目的黑色节点。 通过这些性质,红黑树保证了树的平衡,并且能够在O(log n)的时间复杂度内进行插入、删除和查找等操作。 总之,红黑树和二搜索树的主要差别在于红黑树通过自平衡的机制来保证树的平衡性,具有较好的插入和删除操作的时间复杂度;而二搜索树的平衡性取决于插入顺序,插入和删除操作的时间复杂度可能较高。因此,在需要频繁进行插入和删除操作,并要较好的时间复杂度的情况下,红黑树是更好的选择。 ### 回答3: 红黑树和二搜索树有以下几点差别: 1. 平衡性:红黑树是一种自平衡的二搜索树,它通过一系列的旋转和变色操作保持树的平衡,使得树的高度在O(log n)范围内。而二搜索树并没有自动平衡的机制,如果插入或删除操作不当,可能会导致树的不平衡,使得树的高度增长为O(n),降低了查找、插入和删除操作的效率。 2. 插入与删除操作的复杂度:由于红黑树保持了平衡性,它的插入和删除操作的时间复杂度都是O(log n),这是因为红黑树的调整操作是局部的,只对少数节点进行操作。而二搜索树的插入和删除操作的时间复杂度依赖于树的结构,最坏情况下可能需要O(n)的时间复杂度。 3. 数据结构的性质:红黑树是一种二搜索树,它具有二搜索树的所有属性,即左子节点的值小于父节点,右子节点的值大于父节点。此外,红黑树还具有额外的红黑颜色属性,确保了树的平衡性。而二搜索树只需要满足搜索性质即可,即左子节点的值小于父节点,右子节点的值大于父节点。 4. 内存占用:由于红黑树需要存储额外的颜色属性,相比于普通的二搜索树会占用更多的内存空间。 综上所述,红黑树相较于二搜索树具有自平衡性,插入和删除操作效率更高,但相应地占用更多的内存空间。而二搜索树则简单且易于实现,适用于数据集的搜索较少,插入和删除操作不频繁的场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值