LeetCode236、二叉树的最近公共祖先

题目描述

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;

    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44861675/article/details/114366020