c - 二叉树的最低公共(public)祖先(不是二叉搜索树)

标签 c algorithm data-structures

我尝试使用 Tarjan 的算法和网站上的一种算法解决问题:http://discuss.techinterview.org/default.asp?interview.11.532716.6 ,但没有一个是明确的。也许我的递归概念没有正确建立。请举个小例子来解释上面两个例子。我对 Union Find 数据结构有所了解。

看起来很有趣的问题。所以无论如何都要解码这个问题。准备面试。

如果存在任何其他逻辑/算法,请分享。

最佳答案

LCA 算法试图做一件简单的事情:找出从两个有问题的节点到根的路径。现在,这两条路径将有一个共同的后缀(假设路径在根处结束)。 LCA 是后缀开始的第一个节点。

考虑下面的树:

              r * 
               / \
            s *   *
             / \
          u *   * t
           /   / \
          * v *   *
             / \
            *   *

为了找到 LCA(u, v),我们进行如下操作:

  • 从u到root的路径:Path(u, r) = usr
  • 从v到root的路径:Path(v, r) = vtsr

现在,我们检查公共(public)后缀:

  • 常用后缀:'sr'
  • 因此LCA(u, v) = 后缀的第一个节点= s

请注意实际算法不会一直到根。他们使用 Disjoint-Set 数据结构在到达 s 时停止。

解释了一组优秀的替代方法 here .

关于c - 二叉树的最低公共(public)祖先(不是二叉搜索树),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3540622/

相关文章:

c - 为什么不能使用char

c# - 生成由 3 个不同的 "sub-arrays"组成的项目数组

algorithm - 函数 n^2/log(n) 的大 O 是什么?

mysql - 通过 mysql 使用 JPARepository 批量复制链接行

c++ - main() 在 C 和 C++ 中应该返回什么?

c - 我无法理解 for 循环 block 和 if 语句

algorithm - 复杂度等级 P 的性质

python - 程序将数组分成N个连续的子数组,使得每个子数组的和为奇数

javascript - 创建具有元素路径数组的嵌套数组

在C中使用欧几里德计算矩形的周长