LeetCode 0865.具有所有最深节点的最小子树:深度优先搜索(一次DFS + Python5行)

【LetMeFly】865.具有所有最深节点的最小子树:深度优先搜索(一次DFS + Python5行)

力扣题目链接:https://leetcode.cn/problems/smallest-subtree-with-all-the-deepest-nodes/

给定一个根为 root 的二叉树,每个节点的深度是 该节点到根的最短距离

返回包含原始树中所有 最深节点最小子树

如果一个节点在 整个树 的任意节点之间具有最大的深度,则该节点是 最深的

一个节点的 子树 是该节点加上它的所有后代的集合。

示例 1:

复制代码
输入:root = [3,5,1,6,2,0,8,null,null,7,4]
输出:[2,7,4]
解释:
我们返回值为 2 的节点,在图中用黄色标记。
在图中用蓝色标记的是树的最深的节点。
注意,节点 5、3 和 2 包含树中最深的节点,但节点 2 的子树最小,因此我们返回它。

示例 2:

复制代码
输入:root = [1]
输出:[1]
解释:根节点是树中最深的节点。

示例 3:

复制代码
输入:root = [0,1,3,null,2]
输出:[2]
解释:树中最深的节点为 2 ,有效子树为节点 2、1 和 0 的子树,但节点 2 的子树最小。

提示:

  • 树中节点的数量在 [1, 500] 范围内。
  • 0 <= Node.val <= 500
  • 每个节点的值都是 独一无二 的。

注意: 本题与力扣 1123 重复:https://leetcode-cn.com/problems/lowest-common-ancestor-of-deepest-leaves

解题方法:DFS

思考对于根节点root,答案是什么:

  • 如果左子树比右子树深,说明答案一定在左子树上
  • 如果右子树比左子树深,说明答案一定在右子树上
  • 如果左右子树一样深,说明root就是答案

当左子树(假设为left节点)比右子树深时,答案是哪个呢?

答案是以left为节点时"含所有最深节点最小子树"的答案。

好一个天然递归。递归时候都需要什么?

  1. 树的深度
  2. 答案节点

以上。

  • 时间复杂度 O ( s i z e ( r o o t ) ) O(size(root)) O(size(root))
  • 空间复杂度 O ( d e p t h ( r o o t ) ) O(depth(root)) O(depth(root))

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-01-09 13:19:41
 */
typedef pair<TreeNode*, int> result;
class Solution {
private:
    result dfs(TreeNode* root) {
        result left = root->left ? dfs(root->left) : result{nullptr, 0};
        result right = root->right ? dfs(root->right) : result{nullptr, 0};
        TreeNode* node = left.second == right.second ? root : (left.second > right.second ? left.first : right.first);
        return {node, max(left.second, right.second) + 1};
    }
public:
    TreeNode* subtreeWithAllDeepest(TreeNode* root) {
        return dfs(root).first;
    }
};
Python
python 复制代码
'''
LastEditTime: 2026-01-09 20:58:21
'''
from typing import Optional, Tuple

empty_result = (None, 0)

class Solution:
    def dfs(self, root: TreeNode) -> Tuple[Optional[TreeNode], int]:
        left = self.dfs(root.left) if root.left else empty_result
        right = self.dfs(root.right) if root.right else empty_result
        return [root if left[1] == right[1] else left[0] if left[1] > right[1] else right[0], max(left[1], right[1]) + 1]

    def subtreeWithAllDeepest(self, root: TreeNode) -> TreeNode:
        return self.dfs(root)[0]

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
Q741_14710 小时前
C++ 队列 宽度优先搜索 BFS 力扣 429. N 叉树的层序遍历 C++ 每日一题
c++·算法·leetcode·bfs·宽度优先
Yzzz-F10 小时前
P4145 上帝造题的七分钟 2 / 花神游历各国[线段树 区间开方(剪枝) + 区间求和]
算法·机器学习·剪枝
Zzz不能停10 小时前
堆排序算法及大小堆区别
数据结构·算法
zd84510150010 小时前
stm32f407 电机多轴联动算法
stm32·单片机·算法
代码游侠10 小时前
应用——Linux FrameBuffer图形显示与多线程消息系统项目
linux·运维·服务器·开发语言·前端·算法
Eloudy10 小时前
矩阵张量积(Kronecker积)的代数性质与定理
算法·量子计算
多米Domi01110 小时前
0x3f 第25天 黑马web (145-167)hot100链表
数据结构·python·算法·leetcode·链表
LYFlied10 小时前
【每日算法】LeetCode 207. 课程表
算法·leetcode·职场和发展
sali-tec11 小时前
C# 基于OpenCv的视觉工作流-章7-膨胀
图像处理·人工智能·opencv·算法·计算机视觉