最低共同的祖先破解编码面试解决方案

时间:2014-09-30 11:19:17

标签: algorithm lowest-common-ancestor

我正在尝试理解破解编码访谈页面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;
 }

1 个答案:

答案 0 :(得分:1)

  

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

nodesFromLeft为2时,pq都在root.left之下。 如果其中一个是root.left那么那就是共同的祖先。一个是root.left 另一个在它下面。

  

如果root == p,为什么返回p,这是祖先?

nodesFromLeft为1时,则一个节点位于root.left下,另一个节点位于root之下 root.right下的root,或者树中不存在root。如果是root.right, 那就是祖先。一个不是{{1}}而另一个是在左下方。

在最后两行检查树中{{1}}或不在树下的情况。