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

二叉树的最小深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

说明:叶子节点是指没有子节点的节点。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:2

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int minDepth(TreeNode* root) {// 情况1:空节点,深度为0(递归终止条件)if(!root)return 0;// 情况2:当前节点是叶子节点(无左右子树),深度为1if(!root->left && !root->right)return 1;// 情况3:只有右子树(左子树为空),最小深度为右子树深度+1(当前节点)if(!root->left)return minDepth(root->right) + 1;// 情况4:只有左子树(右子树为空),最小深度为左子树深度+1(当前节点)if(!root->right)return minDepth(root->left) + 1;// 情况5:左右子树都存在,取左右子树最小深度的较小值+1(当前节点)return min( minDepth(root->right) + 1, minDepth(root->left) + 1 );}
};

代码解析

  1. 最小深度定义
    从根节点到最近的叶子节点的路径长度(叶子节点是指没有子节点的节点)。

  2. 递归逻辑

    • 终止条件

      • 空节点深度为 0(if(!root) return 0)。
      • 叶子节点深度为 1(if(!root->left && !root->right) return 1)。
    • 非叶子节点处理

      • 若只有右子树:最小深度 = 右子树最小深度 + 1(当前节点)。
      • 若只有左子树:最小深度 = 左子树最小深度 + 1(当前节点)。
      • 若左右子树都有:最小深度 = 左右子树最小深度的较小值 + 1(当前节点)。
  3. 关键细节
    与最大深度不同,最小深度不能简单取左右子树深度的最小值,因为需要排除 “某一子树为空” 的情况。例如:

    • 若节点左子树为空、右子树非空,则最近叶子节点在右子树中,不能因左子树深度为 0 而取 0+1。

复杂度分析

  • 时间复杂度:O (n),其中n是树的节点总数。每个节点最多被访问一次。
  • 空间复杂度:O(h),h是树的高度。递归调用栈的深度取决于树的高度,最坏情况下(链状树)h = n

http://www.dtcms.com/a/328793.html

相关文章:

  • Android 终端接入 GB28181 国标视频平台的完整解决方案解析
  • 【安卓,问题记录】ImageView 在布局顺序上位于 Button 上方,却出现图像内容被 Button 遮挡
  • AIOPS人才需具备的技术需求
  • 【完整源码+数据集+部署教程】火柴实例分割系统源码和数据集:改进yolo11-rmt
  • latex中“itemize”
  • 如何写出高质量的dify参数提取器prompt
  • 【P21】OpenCV Python——RGB和BGR,HSV和HSL颜色空间,及VScode中报错问题解决
  • vscode扩展应用 -koroFileHeader(jsdoc代码风格注释)
  • .net\c#web、小程序、安卓开发之基于asp.net家用汽车销售管理系统的设计与实现
  • InnoDB如何解决脏读、不可重复读和幻读的?
  • 天文与航天领域专业计算库介绍
  • C# 反射入门:如何获取 Type 对象?
  • Blender模拟结构光3D Scanner(一)外参数匹配
  • 决策树回归:用“分而治之”的智慧,搞定非线性回归难题(附3D可视化)
  • JS 与 C++ 双向通信实战:基于 WebHostViewListener 的消息处理机制
  • Java后端面试题(含Dubbo、MQ、分布式、并发、算法)
  • 分布式与微服务宝典
  • 智能算法流程图在临床工作中的编程视角系统分析
  • 【docker①】在VS Code中使用Docker容器
  • 安全点(Safepoint)完成后唤醒暂停线程的过程
  • 解决uni-app微信小程序编译报错:unexpected character `1`
  • 机器学习实战·第三章 分类(2)
  • EI学术会议 | 虚拟现实、图像和信号处理
  • 股指期货长线还是短线好?
  • AWS Redis Serverless连接完全指南:从安装到实战
  • Notepad++插件开发实战:从入门到精通
  • oss(阿里云)前端直传
  • 使用 Milvus Operator 在 Kubernetes 中部署 Milvus记录
  • LeetCode 刷题【40. 组合总和 II】
  • 3d游戏引擎中ContentTools中的文件模型导入代码1