题目描述
https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/
解法(递归问题——灵活三问)
有时候,思考如何处理,应当适当的思考递归返回的结果情况,然后根据返回的情况作进一步的判断。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
/* 灵魂三问:
1.递归函数的定义是什么?---》返回p,q结点的最近公共祖先
2.这个函数中,变量是什么?--》root,我们递归调用root.left root.right
3.得到了递归结果,你该干嘛?即我们如何找到最近公共祖先
if(root==null) return null;
p,q属于root的子树,则返回p,q的最近公共祖先
p属于root的子树,q不属于,说明q与p同属一棵树,则返回q为最近公共祖先
p,q都不属于root的子树,返回null
*/
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null){
return null;}
if(root==p||root==q){
//返回根结点
return root;
}
//能够从这里出来,说明root!=q 且 root!=p——————————说明p,q都是root的子树
TreeNode left = lowestCommonAncestor(root.left,p,q);//在左子树中找最近公共祖先
TreeNode right = lowestCommonAncestor(root.right,p,q);//在右子树中找公共祖先
//因p,q都是root的子树,如果一个在右子树一个在左子树,则返回root,我们这里采用的是后序遍历,那么
//判断到底哪个是最近公共祖先
//情况1,left==null & right==null
//情况2,left==null right!=null
//情况3,left!=null right==nulll
//情况4,都不null——说明返回的是分别是root.left 和root.right,则它们的祖先是root(二叉树的后序遍历)
if(left!=null && right!=null){
return root;
}else if(left==null && right!=null){
return right;
}else if(left!=null && right==null){
return left;
}else return null;
}
}