涉及根节点的最低公共祖先(LCM)

时间:2015-02-04 05:54:15

标签: java algorithm tree binary-search-tree

假设我有以下二元搜索树,

       30
       /\
      /  \
     8   52
    /\
   /  \
  3   20
      /\
     /  \
    10  29

以下是什么是LCM:

  • 30 and 8
  • 20和29

我不想要代码,但我想知道,以便我能想出如何找到解决问题的方法。

3 个答案:

答案 0 :(得分:0)

这很容易,因为这是一个搜索树,但根据您的要求,我不会提供太多细节。

1)看看你的根。如果它是两个数字中的一个,那么你就找到了共同的祖先。

2)否则,鉴于这是一个搜索树,您可以快速确定它们将出现的子树。考虑一下你必须做的事情(a)如果它们在左子树中,(b)如果它们在右子树中,或(c)一个在左边,一个在右边。

祝你好运!

答案 1 :(得分:0)

树中两个节点v和w的最低共同祖先(LCA)是同时具有v和w作为后代的最低(即最深)节点,其中我们将每个节点定义为其自身的后代(因此,如果v与w直接连接,w是最低共同祖先。

所以这里30是30和8的最小公倍数.20是20和29的最小公倍数.20和52的LCM是30,因为它是最低节点,同时有20和52作为后代。

答案 2 :(得分:0)

最低共同祖先可以定义为树中唯一满足两个条件的节点:

A。所有目标节点都是此节点或此节点的后代, B。此节点的子节点不满足条件A

因此,您正在寻找一个节点,其中条件A对于节点是真的,但是没有子节点。我们知道根节点满足条件A(根据定义)。所以算法如下所示,从root开始:

  1. 如果此节点在目标列表中,那么它就是LCA
  2. 否则在子节点中搜索满足条件A的节点
  3. 任何令人满意的,再次从该孩子的第1步开始
  4. 如果没有满足,那么你有最低的共同祖先
  5. 此算法适用于任何数量的目标,而不仅仅是问题中的2。

    我知道你不想要代码,但我鼓励你看看使用Java 8流:这种情况非常优雅,你正在迭代寻找条件的孩子。