我想了解破解编码采访页面129中的解决方案之一。这是关于找到最低的共同祖先。请参阅下面的代码。我的问题是在评论最低的共同祖先破解代码采访解决方案
总之,我的问题是:
1)这行代码:
if(root.left == p || root.left == q) return root.left;
为什么返回root.left而不是根?
2)对于这些代码:
else if (nodesFromLeft == ONE_NODE_FOUND) {
if (root == p) return p;
else if (root == q) return q;
}
为什么回报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;
}
'我的问题在评论中':不要把它们放在代码中,明确地提出你的问题来明确你的问题。 – 2014-09-30 11:51:31
好的,对不起。已经改进了代码,并在代码之外用粗体提出了问题,并在代码中留下了我不清楚的代码。 – stretchr 2014-09-30 12:19:36