我知道这个问题已被多次询问过。我需要对二叉树(不是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的工作原理是什么?
答案 0 :(得分:0)
11
是您所显示的树中(3, 11)
的正确LCA。
我认为你或许忽略了the definition of LCA中的元素被认为是自己的后代:
...树中的两个节点v和w的最低共同祖先(LCA)或有向无环图(DAG)是同时具有v和w作为后代的最低(即最深)节点,其中我们定义每个节点节点是它自己的后代(所以,如果v与w有直接连接,w是最低的共同祖先)。
(强调我的)
由于3
是11
的孩子,因此LCA为11
。