【Leetcode二叉树的公共祖先问题一】祖先类的模板题目 剑指 Offer 68 - II. 二叉树的最近公共祖先 面试题 04.08. 首个共同祖先 1123.865. 最深叶节点的最近公共祖先



万能解法模板(程序员面试金典有解释哦)!!!!!!!!

分为五个步骤
1.必要的检查
2.可以理解为对于要寻找的节点的判断(每个题变化的部分就是在于对节点的判断!!)
3.递归调用等待结果
4.根据上面的left,right 空和不空组成的四种结果进行相应的处理
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;

    }
};




剑指 Offer 68 - II. 二叉树的最近公共祖先

1.问题描述

在这里插入图片描述

2.解决方案

直接复制万能模板即可




面试题 04.08. 首个共同祖先

1.问题描述

在这里插入图片描述

2.解决方案

直接复制万能模板即可




1123. 最深叶节点的最近公共祖先

1.问题描述

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

2.解决方案

直接套用万能模板,五步骤中只需要改动第二步,也就是改变对目标节点的判断即可
if(deep-1==recursionLayers) 这个条件就揭示了我们对目标结点的判断,其他都不用动

class Solution {
public:

    //套用万能模板
    TreeNode* CommonAncestor(TreeNode* root,int deep,int recursionLayers){
        //1.必要的检查
        if(root== nullptr) return nullptr;

        //2.对要求的节点的判断
        if(deep-1==recursionLayers) return root;

        //3.递归等待结果
        TreeNode* left=CommonAncestor(root->left,deep,recursionLayers+1);
        TreeNode* right=CommonAncestor(root->right,deep,recursionLayers+1);

        //4.四种情况返回
        if(left!= nullptr&&right!= nullptr) return root;
        if(left== nullptr&&right== nullptr) return nullptr;
        if(left!= nullptr&&right== nullptr) return left;
        if(left== nullptr&&right!= nullptr) return right;

        //5.为了通过编译
        return nullptr;

    }

    //recursionLayers为递归深度
    int getDeep(TreeNode* root,int recursionLayers){
        //空树深度
        if(root== nullptr) return recursionLayers;

        return max(getDeep(root->left,recursionLayers+1),getDeep(root->right,recursionLayers+1));
    }


    TreeNode* lcaDeepestLeaves(TreeNode* root) {
        int treeDeep = getDeep(root,0);
        return CommonAncestor(root,treeDeep,0);
    }
};
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值