【Leetcode二叉树的公共祖先问题三】 236. 二叉树的最近公共祖先(万能解法,递归函数返回值的深度理解!!!!!!)



Leetcode236

1.问题描述

在这里插入图片描述

2.解决方案

解法一:万能解法

万能解法
面试题04.08.首个共同祖先

//万能解法
class Solution4 {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        //1.必要的检查
        if(root== nullptr) return nullptr;

        //2.可以理解为对于要寻找的节点的判断
        if(root==p||root==q) return root;

        //3.递归调用等待结果
        TreeNode* left=lowestCommonAncestor(root->left,p,q);
        TreeNode* right=lowestCommonAncestor(root->right,p,q);

        //4.根据上面的left,right 空和不空组成的四种结果进行相应的处理
        if(left!= nullptr&&right!= nullptr) return root;
        if(left== nullptr&&right== nullptr) return nullptr;
        if(left== nullptr&&right!= nullptr) return right;
        if(left!= nullptr&&right== nullptr) return left;

        //5.为了通过编译实则不可能从这走
        return nullptr;

    }
};



解法二:深度剖析回溯万能解法


1.本题关于递归返回值的思考!!!!!

在这里插入图片描述
在这里插入图片描述



2.思路:

在这里插入图片描述


3.关于递归函数的深度解析:

我只能说这个真的很重要!!!虽然代码其实很好写,但是理解好了更重要,理解这句话,一切的return最初都来自于,if(root= =p||root= =q) return root/nullptr,然后将信息一层一层往上传,包括这是一个后序遍历回溯的过程也很重要!!

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述



4.总结难点:

在这里插入图片描述



5.代码:
//万能解法
class Solution4 {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        //1.必要的检查
        if(root== nullptr) return nullptr;

        //2.可以理解为对于要寻找的节点的判断
        if(root==p||root==q) return root;

        //3.递归调用等待结果
        TreeNode* left=lowestCommonAncestor(root->left,p,q);
        TreeNode* right=lowestCommonAncestor(root->right,p,q);

        //4.根据上面的left,right 空和不空组成的四种结果进行相应的处理
        if(left!= nullptr&&right!= nullptr) return root;
        if(left== nullptr&&right== nullptr) return nullptr;
        if(left== nullptr&&right!= nullptr) return right;
        if(left!= nullptr&&right== nullptr) return left;

        //5.为了通过编译实则不可能从这走
        return nullptr;

    }
};
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值