思路:递归三部曲
第一步:确定参数和返回值
题目要求找到指定的结点,就需要返回结点。
题目又涉及到p,q就需要传入p,q,需要遍历传入root
第二步:确定终止条件
当遍历到结点为空说明到底没找到返回空
或者遍历到p,q目标结点返回目标结点
第三步:确定单层逻辑
首先要找到最近公共结点和p,q有什么特别关系
一种情况就是p,q在root的左右子树上
最近祖先就是当left和right都不为空时
二种情况就是p,q本身就是最近公共祖先,p/q在左右子树上
这种情况遍历到的第一个目标p/q就是题目所要的最近公共祖先返回即可
其他所有的结点都是null即不是目标结点,直接将搜索到的第一个p/q(不是null的结点)一路返回
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;}if(left != null && right != null){return root;}if(left != null){return left;}if(right != null){return right;}return root;}
}