每日一题——二叉树的深度

embedded/2025/3/22 4:43:50/

二叉树的最大深度

    • 问题描述
      • 示例
    • 方法一:递归法
      • 代码实现
      • 代码解析
    • 方法二:层次遍历(广度优先搜索)
      • 代码实现
      • 代码解析
    • 总结

问题描述

给定一个二叉树的根节点 root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。

示例

示例 1
输入:root = [3,9,20,null,null,15,7]
输出:3
解释:从根节点到最远叶子节点的最长路径为 3 -> 20 -> 153 -> 20 -> 7,路径长度为 3。

示例 2
输入:root = [1,null,2]
输出:2
解释:从根节点到最远叶子节点的最长路径为 1 -> 2,路径长度为 2。

方法一:递归法

递归法是一种直观且高效的方法,利用二叉树的递归性质,分别计算左子树和右子树的最大深度,取较大值并加 1。

代码实现

int maxDepth(struct TreeNode* root) {if (root == NULL) {  // 如果根节点为空,直接返回深度为0return 0;}// 递归计算左子树和右子树的最大深度int leftDepth = maxDepth(root->left);int rightDepth = maxDepth(root->right);return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
}

代码解析

  1. 递归终止条件:如果当前节点为空,返回深度为 0。
  2. 递归逻辑
    • 递归计算左子树的最大深度 leftDepth
    • 递归计算右子树的最大深度 rightDepth
    • 返回左右子树的最大深度值加 1(当前节点的深度)。
  3. 时间复杂度:O(n),其中 n 是二叉树的节点数。每个节点被访问一次。
  4. 空间复杂度:O(h),其中 h 是二叉树的高度。递归调用栈的深度等于二叉树的高度。

方法二:层次遍历(广度优先搜索)

层次遍历是一种基于队列的广度优先搜索方法,逐层遍历二叉树,计算层数即为最大深度。

代码实现

int maxDepth(struct TreeNode* root) {if (root == NULL) {  // 如果根节点为空,直接返回深度为0return 0;}struct TreeNode** que = malloc(sizeof(struct TreeNode*) * 10000);  // 队列int front = 0;       // 队列头部指针int rear = 0;        // 队列尾部指针int depth = 0;       // 当前深度que[rear++] = root;  // 根节点入队while (front < rear) {int levelSize = rear - front;  // 当前层的节点数for (int i = 0; i < levelSize; i++) {root = que[front++];       // 出队if (root->left) {          // 如果有左子节点,入队que[rear++] = root->left;}if (root->right) {         // 如果有右子节点,入队que[rear++] = root->right;}}depth++;                       // 每处理完一层,深度加1}free(que);                         // 释放队列内存return depth;
}

代码解析

  1. 队列初始化
    • 使用指针数组 struct TreeNode** que 模拟队列。
    • front 指向队列头部,rear 指向队列尾部。
  2. 层次遍历逻辑
    • 将根节点入队。
    • 当队列不为空时,计算当前层的节点数 levelSize
    • 遍历当前层的所有节点,将其子节点依次入队。
    • 每处理完一层,深度加 1。
  3. 时间复杂度:O(n),其中 n 是二叉树的节点数。每个节点被访问一次。
  4. 空间复杂度:O(n),队列在最坏情况下可能存储所有节点。

总结

计算二叉树的最大深度可以通过递归或层次遍历实现。递归法代码简洁,适合深度优先搜索;层次遍历法适合广度优先搜索,逻辑清晰,适合理解二叉树的层次结构。


http://www.ppmy.cn/embedded/174326.html

相关文章

软考中级-数据库-5.3-Internet基础知识

主要考点 1、域名 2、IP地址 3、子网掩码 4、IPv6 5、Internet服务 域名 1、域名的格式&#xff1a; • 计算机主机名.本地名.组名.最高层域名 例&#xff1a;www.hust.edu.cn&#xff0c;www.cnnic.net.cn www.5566.net www.sina.com 2、URL的格式&#xff1a; 协议://主机.域…

RuoYi框架连接SQL Server时解决“SSL协议不支持”和“加密协议错误”

RuoYi框架连接SQL Server时解决“SSL协议不支持”和“加密协议错误” 在使用RuoYi框架进行开发时&#xff0c;与SQL Server数据库建立连接可能会遇到SSL协议相关的问题。以下是两个常见的错误信息及其解决方案。 错误信息1 com.zaxxer.hikari.pool.HikariPool$PoolInitializ…

CVE-2017-5645(使用 docker 搭建)

介绍: 是一个与 Apache Log4j2 相关的安全漏洞,属于远程代码执行,它可能允许攻击者通过构造恶意的日志信息 在目标系统上执行任意代码 Log4j2 介绍 Log4j2 是 Apache 的一个日志记录工具,属于 Java 应用的日志框架,它是 Log4j 的升级版,性能更好,功能更多.它被广泛的适用于 J…

win10 如何用我的笔记本 接网线 远程控制 台式机

1.查看笔记本ip&#xff0c;台式机ip。确保在同一网段 可以ping通 1.1 ip在同一网段&#xff0c;但是ping不通 1.解决&#xff1a;把双方防火墙关闭 2.解决&#xff1a;当前网口&#xff0c;先禁用再启用 以上两台电脑就可以ping通了 2.设置双方电脑 启动远程控制 此电脑-》…

Oracle 19C分区表索引小结

一、大佬说&#xff08;杨廷琨&#xff09; LOCAL索引的最大好处是在进行分区操作&#xff0c;比如TRUNCATE PARTITION, DROP PARTITION时&#xff0c;不会出现索引INVALID的情况&#xff0c;不影响索引的可用性。由于GLOBAL索引所有的数据存储在一起&#xff0c;因此当执行分…

NFC 碰一碰发视频源码搭建,支持OEM

一、引言 NFC&#xff08;Near Field Communication&#xff09;近场通信技术&#xff0c;以其便捷、快速的数据交互特性&#xff0c;正广泛应用于各个领域。其中&#xff0c;NFC 碰一碰发视频这一应用场景&#xff0c;为用户带来了新颖且高效的视频分享体验。想象一下&#x…

启发式搜索:A*算法《人工智能案例与实验》

声明&#xff1a;著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 实验结果&#xff1a; 1.1 教学目标 (1)让学生能够应用基于搜索的技术来实现问题求解智能体。能够进行问题建模、数据结构设计及A*算法设计。 (2)能够对 A*算法和 Dijkstra …

【从零开始学习计算机科学与技术】计算机网络(五)网络层

【从零开始学习计算机科学与技术】计算机网络(五)网络层 网络层无连接服务的实现:数据报子网面向连接服务的实现:虚电路子网IP协议子网及子网划分子网掩码子网规划可变长子网掩码 (VLSM)无类别域间路由—CIDRIP路由转发过程ARP与RARPARP的工作过程:RARP的工作过程如下:DH…