我有一个AVL树和2个键。如何找到具有O(logn)复杂度的最低共同祖先(最低,我的意思是高,而不是值)? 我在stackoverflow上看到了一个答案,但我承认我并不完全理解它。它涉及查找从每个密钥到根的路由,然后比较它们。我不确定这是如何满足复杂性要求的
答案 0 :(得分:0)
对于您向上移动的第一个节点,标记节点。对于第二个节点,您向上移动并查看路径上的节点是否已标记。一旦找到标记的节点,就可以停止。 (并通过再次执行第一条路径来删除标记。)
如果您无法直接在树中标记节点,请修改包含的值以包含可以标记的位置。如果你不能这样做,那么添加一个存储标记的节点的散列图。
这是O(logn),因为树的深度是O(logn),最差的是你走了3次到根。
此外,如果您希望可以交替使用两个路径的步骤,而不是首先完全走第一条路径。 (请注意,然后两个路径都必须检查标记。)如果您希望这两个节点的祖先在某种程度上是本地的,那么这可能会更好。渐近运行时与上面相同。
答案 1 :(得分:0)
AVL树(平衡二叉搜索树)的更好解决方案是(我使用了C指针,如符号) -
K1
和K2
为2个密钥,为其找到LCA。假设K1 < K2
P = root
P->key >= K1
和P->key <= K2
:return P
P->key > K1
和P->key > K2
:P = P->left
P = P->right
返回的P指向所需的LCA。
请注意,此方法仅适用于BST,而不适用于任何其他二叉树。