当前位置: 首页 > news >正文

每日一道leetcode(回来了!!!)

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

题目

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

示例 2:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1

提示:

  • 树中节点数目在范围 [2, 105] 内。
  • -109 <= Node.val <= 109
  • 所有 Node.val 互不相同 。
  • p != q
  • p 和 q 均存在于给定的二叉树中。

思路

  1. 首先定义一个全局结果节点,用于保存最早出现的满足条件的祖先节点。
  2. 然后利用后序遍历的深度优先搜索,保证最先找到的满足条件的节点一定是深度最大的(即最低的/最靠近两个目标节点的/最深的),因为都是先统计左右子树在算根,所以对任意节点,若左右子树有了,并赋给全局结果节点,那么该节点将不会更新,仅仅完成dfs的任务。

代码实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* ans;
    int find_descendant(TreeNode* now, TreeNode* p, TreeNode* q) {
        int cnt = 0;
        if(now==p || now==q) {
            cnt++;
        }
        if(now->left) cnt += find_descendant(now->left, p, q);
        if(now->right) cnt += find_descendant(now->right, p, q);
        if(!ans && cnt==2) ans = now;
        return cnt;
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        ans = nullptr;
        int cnt = 0;
        if(root==p || root==q) cnt++;
        if(root->left) cnt += find_descendant(root->left, p, q);
        if(root->right) cnt += find_descendant(root->right, p, q);
        if(!ans && cnt==2) ans = root;
        return ans;
    }
};

复杂度分析

  • 时间复杂度:深度优先搜索只对每个节点进行一次遍历,时间复杂度为O(n)。
  • 空间复杂度:空间复杂度取决于栈空间的大小,等价于树的深度,最坏空间复杂度为O(n)(变成一条线的斜树)。

相关文章:

  • 信息系统项目管理师-工具名词解释(上)
  • A2A协议实现详解及示例
  • 深入解析Java中的双向队列(Deque):操作、实现与应用
  • Django 开发服务器
  • n8n AI工作流平台使用教程
  • #MES系统中的一些相关的名词
  • Linux命令-vim编辑
  • 2025年Q1 AI 学习应用总结
  • 8.8.1 简易计算器
  • css一些注意事项
  • 【linux】使用LNMP环境+Discuz论坛源程序
  • Excel处理控件Aspose.Cells指南:使用 Python 删除 Excel 中的重复行
  • Web Worker 中的 DedicatedWorkerGlobalScope 对象
  • LeetCode hot 100—搜索二维矩阵
  • 单片机 + 图像处理芯片 + TFT彩屏 触摸开关控件 v1.2
  • C语言核心结构+难点精讲+工程技巧
  • LLM - Dify 平台介绍
  • linux多线(进)程编程——番外1:内存映射与mmap
  • Java万级并发场景-实战解决
  • AI大模型原理可视化工具:深入浅出理解大语言模型的工作原理
  • “75后”袁达已任国家发改委秘书长
  • 黄晓丹:用“诗心”找到生存的意义
  • 现场|西岸美术馆与蓬皮杜启动新五年合作,新展今开幕
  • 央媒关注给保洁人员设休息室:让每一份踏实奋斗得到尊重呵护
  • 上海超万套保租房供应高校毕业生,各项目免押、打折等优惠频出
  • 广西给出最后期限:6月30日之前主动交代问题可从宽处理