题干:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。
class Solution {
public 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;
else if(left!=null && right!=null) return root;
else if(left==null && right!=null) return right;
else return left;
}
}
主要思路还是递归,然后通过判断左右结点(left、right)是否为空来设置返回值。其实就是判断左右结点是否包含p、q结点。
返回值的不同主要是情况不同,主要有四种情况:
- 左右结点都为空,也就是说遍历结束后均未找到p、q结点,故返回为空。
- 左右结点都不为空,也就是说找到p、q结点分别位于当前root结点的异侧,那么当前root结点就是p、q的最近公共祖先,故返回root。
- 左结点为空,右结点不为空,说明p、q结点位于当前root结点的同侧(此时是在右侧),那么当前root的右结点就是p、q的最近公共祖先,故返回right结点。
- 左结点不为空,右结点为空,说明p、q结点位于当前root结点的同侧(此时是在左侧),那么当前root的左结点就是p、q的最近公共祖先,故返回left结点。