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和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
啊森要自信15 小时前
CANN ops-cv:AI 硬件端视觉算法推理训练的算子性能调优与实战应用详解
人工智能·算法·cann
仟濹15 小时前
算法打卡day2 (2026-02-07 周五) | 算法: DFS | 3_卡码网99_计数孤岛_DFS
算法·深度优先
驭渊的小故事15 小时前
简单模板笔记
数据结构·笔记·算法
YuTaoShao15 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
VT.馒头15 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
goodluckyaa16 小时前
LCR 006. 两数之和 II - 输入有序数组
算法
孤狼warrior16 小时前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
Σίσυφος190016 小时前
PCL法向量估计 之 RANSAC 平面估计法向量
算法·机器学习·平面
xhbaitxl16 小时前
算法学习day39-动态规划
学习·算法·动态规划
I_LPL16 小时前
day23 代码随想录算法训练营 回溯专题2
算法·hot100·回溯算法·求职面试