在AVL树中定位最低共同祖先

时间:2014-05-14 08:27:17

标签: algorithm avl-tree

我有一个AVL树和2个键。如何找到具有O(logn)复杂度的最低共同祖先(最低,我的意思是高,而不是值)? 我在stackoverflow上看到了一个答案,但我承认我并不完全理解它。它涉及查找从每个密钥到根的路由,然后比较它们。我不确定这是如何满足复杂性要求的

2 个答案:

答案 0 :(得分:0)

对于您向上移动的第一个节点,标记节点。对于第二个节点,您向上移动并查看路径上的节点是否已标记。一旦找到标记的节点,就可以停止。 (并通过再次执行第一条路径来删除标记。)

如果您无法直接在树中标记节点,请修改包含的值以包含可以标记的位置。如果你不能这样做,那么添加一个存储标记的节点的散列图。

这是O(logn),因为树的深度是O(logn),最差的是你走了3次到根。

此外,如果您希望可以交替使用两个路径的步骤,而不是首先完全走第一条路径。 (请注意,然后两个路径都必须检查标记。)如果您希望这两个节点的祖先在某种程度上是本地的,那么这可能会更好。渐近运行时与上面相同。

答案 1 :(得分:0)

AVL树(平衡二叉搜索树)的更好解决方案是(我使用了C指针,如符号) -

  1. K1K2为2个密钥,为其找到LCA。假设K1 < K2
  2. 树的指针P = root
  3. 如果P->key >= K1P->key <= K2return P
  4. 如果P->key > K1P->key > K2P = P->left
  5. 其他P = P->right
  6. 重复步骤3至5
  7. 返回的P指向所需的LCA。

    请注意,此方法仅适用于BST,而不适用于任何其他二叉树。