当前位置: 首页 > 知识库问答 >
问题:

最低共同祖先

东郭自珍
2023-03-14

我的问题是树中有大量的节点和许多查询。是否有一种算法,它进行预处理,使查询能够在恒定的时间内得到答复。

我研究了使用RMQ的LCA,但我不能使用该技术,因为我不能对树中的这么多节点使用数组。

如果知道它是满二叉树,节点之间的关系如上所示,那么有人能给我一个高效的实现来快速回答许多查询。

但是当有很多查询时,这种算法非常耗时,因为在最坏的情况下,我可能必须遍历30的高度(树的最大高度)才能到达根(最坏的情况)。

共有1个答案

太叔经赋
2023-03-14

如果您用二进制表示这两个索引,那么可以通过两个步骤找到LCA:

  1. 右移较大的数字,直到前导1位与另一个数字在同一位置。
  2. 向右移动两个数字,直到它们相同。

第一步可以通过获得数字的对数基数2,并将较大的数字向右移动差值来完成:

if a>b:
    a = shift_right(a,log2(a)-log2(b))
else:
    b = shift_right(b,log2(b)-log2(a))
if a==b:
    return a
else:
    return shift_right(a,log2(xor(a,b))+1)
 类似资料:
  • 问题内容: 这是一个受欢迎的面试问题,我唯一可以找到的有关该主题的文章是TopCoder的文章。对我来说不幸的是,从访谈答案的角度来看,它看起来过于复杂。 除了绘制到两个节点的路径并推导祖先之外,没有其他更简单的方法了吗?(这是一个很流行的答案,但是面试题有一个变体,要求一个固定的空格答案)。 问题答案: 恒定空间答案:(尽管不一定有效)。 有一个函数findItemInPath(int inde

  • 我有以下树结构: 其中每个节点最多有一个父节点,但可以有多个子节点。我试图找到两个没有任何子节点(node1和node2)的最低共同祖先。 这是我当前的代码: 这段代码并不总是起作用,我不知道为什么。

  • 如果我拆分while循环,有什么不同吗?谢了!

  • 68.1 二叉查找树 题目链接 Leetcode : 235. Lowest Common Ancestor of a Binary Search Tree 解题思路 在二叉查找树中,两个节点 p, q 的公共祖先 root 满足 root.val >= p.val && root.val <= q.val。 // java public TreeNode lowestCommonAncestor

  • 我试图通过自顶向下递归实现二叉树最低公共祖先(LCA)问题的解决方案。 我使用的方法是: 想法:找到在任一子树中有一个所需节点的节点,而另一个所需节点是相反的子树。 以下是确切的实现: 例如: 这将返回树的根作为结果。结果=TreeNode(2)

  • 我的问题是:“这是已知算法的已知问题吗?”。我怀疑是。它似乎非常类似于拓扑排序。我有一个基于合并排序的算法的想法,但如果已知的算法已经存在,就没有理由提出我自己的算法。