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

[特殊字符] LeetCode 1123. 最深叶节点的最近公共祖先 | DFS后序遍历题解

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

📌 题目描述

给你一棵二叉树,返回最深的所有叶子节点的最近公共祖先(LCA)

例如,以下树:

3

/
5 1
/| |
6 2 0 8
/
7 4
python
复制
编辑

最深叶子节点是 7 和 4,它们的最近公共祖先是节点 2。

🧠 解题思路

这是一道非常经典的树的后序遍历问题。

我们需要做两件事:

  1. 找最深的叶子节点
  2. 找这些最深叶子节点的最近公共祖先

🔁 DFS后序遍历策略:

  • 对每个节点递归获取其左子树、右子树的最大深度
  • 如果左右子树深度相等,当前节点就是 LCA
  • 如果某一边更深,就往那边继续找

🧪 代码实现(Python)

class Solution:
    def lcaDeepestLeaves(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        def dfs(node: Optional[TreeNode]) -> (int, Optional[TreeNode]):
            if not node:
                return 0, None
            left_depth, left_node = dfs(node.left)
            right_depth, right_node = dfs(node.right)
            
            if left_depth > right_depth:
                return left_depth + 1, left_node
            elif left_depth < right_depth:
                return right_depth + 1, right_node
            else:
                return left_depth + 1, node

        return dfs(root)[1]
✅ 复杂度分析
时间复杂度:O(n),遍历整棵树一次

空间复杂度:O(h),h 是树的高度(递归栈)

🌟 总结
这题和「865.具有所有最深节点的最小子树」是同一道题。

利用后序遍历(自底向上)结合深度信息,可以一次性得到结果。非常经典的一道树形 DFS 题目!


相关文章:

  • C# System.Text.Json 中 JsonConverter 使用详解
  • 智能指针【C++】
  • Android Compose入门和基本使用
  • 基于SSM的购物商城系统
  • Linux的: /proc/sys/net/ipv6/conf/ 笔记250405
  • 嵌入式学习笔记——大小端及跳转到绝对地址
  • labelme json 标签转yolo txt【记录】
  • 在Spring Boot中实现图片上传和修改
  • STM32看门狗原理与应用详解:独立看门狗 vs 窗口看门狗(上) | 零基础入门STM32第九十四步
  • 设计模式:为什么使用模板设计模式(不相同的步骤进行抽取,使用不同的子类实现)减少重复代码,让代码更好维护。
  • C++语言的网络编程
  • 第一章:服务架构演进史_《凤凰架构:构建可靠的大型分布式系统》_Notes
  • 英文单词记忆系统:基于PyQt5与DeepSeek大模型的智能学习工具
  • UDP学习笔记(四)UDP 为什么大小不能超过 64KB?
  • 高级:性能优化面试题深度剖析
  • Node.js局部生效的中间件
  • pyTorch框架-迁移学习-实现四种天气图片多分类问题
  • 【Windows批处理】命令入门详解
  • Rust 2024介绍 | 开发环境搭建详细教程(rust 1.85.0)
  • 《Glance:一站式聚合信息,告别浏览器切换烦恼》
  • 企业网站可概括为/seo培训资料
  • 哪个做网站的公司好/郑州新闻发布
  • bootstrap怎么做网站/360搜索推广
  • 宗亲网站开发6/互联网营销师是做什么的
  • 个人站长做网站需要多少钱/百度广告登录入口
  • 做IT的会做网站吗/建立一个网站需要多少钱