2014-09-30 27 views
-1

我想了解破解编码采访页面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; 
} 
+0

'我的问题在评论中':不要把它们放在代码中,明确地提出你的问题来明确你的问题。 – 2014-09-30 11:51:31

+0

好的,对不起。已经改进了代码,并在代码之外用粗体提出了问题,并在代码中留下了我不清楚的代码。 – stretchr 2014-09-30 12:19:36

回答

1

为什么返回root.left而不是根?

nodesFromLeft是2时,那么两个pqroot.left下。 如果其中之一是root.left那么这是共同的祖先。一种是root.left ,另一种是低于它。

为什么返回p如果root == p,这个祖先怎么样?

nodesFromLeft是1,则一个节点是root.left下,另一个是 要么rootroot.right下,或者不存在于树存在。如果它是root, 那么这就是祖先。一个不是root,另一个是在左边。

在最后两行检查它在root.right下或不在树中的情况。

+0

当你说'如果他们中的一个是root.left,那么这就是共同的祖先',我在当前的理解方面存在差异,因为如果其中一个是root.left,另一个是root.left,它应该不是'root '那是共同的祖先? – stretchr 2014-09-30 12:48:14

+0

@stretchr一个节点可以将自己作为一个祖先,所以我们不需要升级。 http://en.wikipedia.org/wiki/Lowest_common_ancestor的第一段描述了这种情况:“如果v与w有直接连接,w是最低的共同祖先” – fgb 2014-09-30 16:20:06

+0

我看到了,明白了。不知道一个节点可以自己作为祖先。这澄清很多,谢谢! – stretchr 2014-09-30 23:59:00