代码随想录算法训练营第30天|LeetCode236.二叉树的最小公共祖先

文章介绍了LeetCode问题236的解决方案,涉及二叉树的最小公共祖先查找,通过自底向上遍历(回溯)策略,以及递归函数实现,重点讲解了两种情况:节点分别在左右子树和节点本身就是祖先的情况。
摘要由CSDN通过智能技术生成

代码随想录算法训练营第30天|LeetCode236.二叉树的最小公共祖先

1、LeetCode236.二叉树的最小公共祖先

236. 二叉树的最近公共祖先 - 力扣(LeetCode)

自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先_哔哩哔哩_bilibili

没啥想法。是彻底地不会写。

思路

找到了两个节点p,q,那么往上遍历,找到交汇节点即最小公共祖先。

Q:入口是根节点,那么如何从下往上遍历呢?
A:遍历顺序是从上往下,但是处理顺序可以是从下往上。——回溯,从底往上处理结果。后序遍历。

情况

情况1:
节点分别在左右子树。

  • 左子树只要出现了P,Q,往上返回,右子树同。(这样不会出现左右都是p的情况吗?不会,因为题目中说了二叉树的值不重复)
  • 左右都不为空,那么中就是最小公共祖先。

情况2:
节点本身就是祖先。
情况1包括了情况2。

236.二叉树的最近公共祖先2

递归三部曲

  1. 函数参数和返回值:传递根节点,p,q;返回p,q的最小公共祖先。
  2. 终止情况
    1. root为空,返回空
    2. 若是p或q,返回root
  3. 单层逻辑
    1. 左:左子树是否出现了p或q
      1. 左不空,右不空。返回root。
      2. 左空,右不空。返沪右
      3. 左不空,右空。返回左
      4. 左右都空,返回NULL

如何包含情况2?若root为p或q,直接返回root了,没有遍历root以下的树。

代码

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        // 终止条件
        if(root == NULL)
            return NULL;
        if(root == p || root == q)
            return root;
        
        // 单层逻辑
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);
        if(left && right)
            return root;
        else if(left == NULL && right)
            return right;
        else if(left && right==NULL)
            return left;
        else
            return NULL;
    }
};
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值