我正在尝试理解破解编码访谈页面129中的一个解决方案。这是关于找到最低共同祖先。请参阅下面的代码。我的问题在评论中
总之,我的问题是:
1)对于这行代码:
if(root.left == p || root.left == q) return root.left;
为什么要返回root.left而不是root?
2)对于这些代码行:
else if (nodesFromLeft == ONE_NODE_FOUND) {
if (root == p) return p;
else if (root == q) return q;
}
为什么如果root == p返回p,这个祖先怎么样?同样适用于q。
以下是完整的代码:
static int TWO_NODES_FOUND = 2;
static int ONE_NODE_FOUND = 1;
static int NO_NODES_FOUND = 0;
// Checks how many “special” nodes are located under this root
int covers(TreeNode root, TreeNode p, TreeNode q) {
int ret = NO_NODES_FOUND;
if (root == null) return ret;
if (root == p || root == q) ret += 1;
ret += covers(root.left, p, q);
if(ret == TWO_NODES_FOUND) // Found p and q
return ret;
return ret + covers(root.right, p, q);
}
TreeNode commonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (q == p && (root.left == q || root.right == q)) return root;
int nodesFromLeft = covers(root.left, p, q); // Check left side
if (nodesFromLeft == TWO_NODES_FOUND) {
if(root.left == p || root.left == q) return root.left;//Qn1:See above
else return commonAncestor(root.left, p, q);
}
else if (nodesFromLeft == ONE_NODE_FOUND) {
if (root == p) return p; //Qn 2: See qn above
else if (root == q) return q; //Qn2: See qn above
}
int nodesFromRight = covers(root.right, p, q); // Check right side
if(nodesFromRight == TWO_NODES_FOUND) {
if(root.right == p || root.right == q) return root.right;
else return commonAncestor(root.right, p, q);
}
else if (nodesFromRight == ONE_NODE_FOUND) {
if (root == p) return p;
else if (root == q) return q;
}
if (nodesFromLeft == ONE_NODE_FOUND && nodesFromRight == ONE_NODE_FOUND) return root;
else return null;
}
答案 0 :(得分:1)
为什么要返回root.left而不是root?
当nodesFromLeft
为2时,p
和q
都在root.left
之下。
如果其中一个是root.left
那么那就是共同的祖先。一个是root.left
另一个在它下面。
如果root == p,为什么返回p,这是祖先?
当nodesFromLeft
为1时,则一个节点位于root.left
下,另一个节点位于root
之下
root.right
下的root
,或者树中不存在root
。如果是root.right
,
那就是祖先。一个不是{{1}}而另一个是在左下方。
在最后两行检查树中{{1}}或不在树下的情况。