二叉树的LCA - 需要一些建议

时间:2015-10-12 20:42:30

标签: java binary-tree lowest-common-ancestor

我知道这个问题已被多次询问过。我需要对二叉树(不是BST)的LCA做一些澄清。如果我试图从给定的树中找到两个节点(3,11)的LCA:

    _______1______
   /              \
 ___2__          ___4__
/      \        /      \
6       5       9       11
                       /  \
                       7   3

守则为(3,11)返回11。

 // Binary Tree LCA not BST
 private Node findLowestCommonAncestor(Node root, int value1, int value2) {

Node leftLCA = null;
Node rightLCA = null;

if (root == null) {
  return null;
}

else {
  int value = root.item;

  if (value == value1 || value == value2) {
    return root;

  }

  else {

    leftLCA = findLowestCommonAncestor(root.left, value1, value2);
    rightLCA = findLowestCommonAncestor(root.right, value1, value2);

    if (leftLCA != null && rightLCA != null) {
      return root;
    }

    return (leftLCA != null) ? leftLCA : rightLCA;
  }
}

}

这里我很困惑,应该是4对。如果我错了,请纠正我。我在这里困惑吗?或者LCA的工作原理是什么?

1 个答案:

答案 0 :(得分:0)

11是您所显示的树中(3, 11)的正确LCA。

我认为你或许忽略了the definition of LCA中的元素被认为是自己的后代:

  

...树中的两个节点v和w的最低共同祖先(LCA)或有向无环图(DAG)是同时具有v和w作为后代的最低(即最深)节点,其中我们定义每个节点节点是它自己的后代(所以,如果v与w有直接连接,w是最低的共同祖先)。

(强调我的)

由于311的孩子,因此LCA为11