最近公共祖先问题
6的祖先结点有3和5,7的是3、5、2,所以6和7的最近公共祖先是5。如果要用代码实现,需要考虑好几种情况。根据以上定义,若oot是p,q的最近公共祖先,则只可能为以下情况之一:
(1)p和q在root的子树中,且分列root的异侧(即分别在左、右子树中);
(2)p=root,且q在root的左或右子树中;
(3)q=root,且p在root的左或右子树中;
需要判断的逻辑是:
·1.如果Ieft和right都为null,说明在该子树root里p和q一个都没找到,直接返回null即可。
·2.如果left和right都不为null,说明p和q分别在root的两侧,直接返回root即可。
·3.当right为空,let不为空时,先判断一下root是不是p或者q,如果是说明q和p一个是另一个的祖先,直接返回就好了,否测说明right子树里什么都没查到,此时需要递归的去左子树查即可。
·4如果Ieft为空,而right不为空,说明是与情况3相反的情况。
public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || root == p || root == q){ return root;}
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
if (left == null && right == null){ return null;} // 1.
if (left == null){ return right;} // 3.
if (right == null){ return left;} // 4.
return root; // 2. if(left != null and right != null)
}