【问题标题】:Trouble finding the successor of a key in a balanced binary search tree在平衡二叉搜索树中找不到键的后继者
【发布时间】:2013-10-30 18:19:23
【问题描述】:

正如问题所述,我正在尝试找到一种算法来找到平衡二叉搜索树中键“k”的后继。我认为平衡的 BST 与 AVL 树相同(如果我错了,请纠正我)。我希望我能在 O(log n) 时间内一次性完成此操作,但我发现的所有内容都表明我需要先从树的右侧向下,然后从左侧向下。我对整棵树都是新手,但仍然觉得它有点混乱。任何帮助将不胜感激!

谢谢。

【问题讨论】:

  • 给定一个元素 k 存储在你的树中,你想找到你的树的元素 j 使得没有元素 i 验证 k i j ?我说的对吗?

标签: algorithm binary-search-tree


【解决方案1】:

在二叉搜索树中,您有两个向下的路径选项:leftright。 现在假设我们在节点 N 中有一个元素 k。我们要找到k的后继者,也就是树中大于k的最小元素。

这里有 3 个用例:

  • N 有一个非 NULL right 子节点:right 子树的最左边元素是 k 的后继元素。
  • N 没有这样的 孩子,并且是其父 P 孩子.在这种情况下,P 持有 k 的继任者。
  • 最后,N 是其父 P 子级。然后,要找到它的继任者,您必须遵循如下所示的更详细的过程...

S = Parent(P) 开始:而 S ≠ 根 AND P ≠左(S)

  1. P ← S
  2. S ← Parent(S)

如果 S = Root 且 P = Right(S),则 k 是树...否则,只需在设置 S ← Right(S) 后执行以下循环:

S ≠ NULL :

  1. P ← S
  2. S ← 左(S)

当这个循环结束时,P 持有 k 的继任者。

【讨论】:

  • 感谢您的回复!所以,无论哪种方式,我都必须往下走?
  • @pfinferno 您必须弄清楚您属于 3 种情况中的哪一种并采取适当的行动。
  • 哦,我现在明白了!这就说得通了。非常感谢你(你也是亨利)。
  • 对不起,我可能只是新手。但是,什么是 Left()?
【解决方案2】:

如果键为 k 的节点有一个右子树,则它是该子树中最左边的节点。 否则,如果键为 k 的节点是左子节点,则它是该节点的父节点。 否则,找到该节点的最接近的祖先,而不是其具有右子树的直接父节点,它是该子树中最左边的节点。如果不存在这样的祖先,则该节点是最大的并且没有后继。

由于树是平衡的,你总是可以在 O(log n) 中找到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多