剑指offer53_二叉树的深度

二叉树的深度


输入一棵二叉树的根结点,求该树的深度。

从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

数据范围

树中节点数量 [ 0 , 500 ] [0,500] [0,500]

样例
输入:二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]如下图所示:8/ \12  2/ \6   4输出:3

算法思路

该算法使用递归的方式计算二叉树的最大深度。对于每个节点,其深度等于其左右子树深度的最大值加1。递归的终止条件是遇到空节点,此时深度为0。

  • 时间复杂度:O(n),其中n是二叉树的节点数。因为需要访问每个节点一次。
  • 空间复杂度:O(h),其中h是二叉树的高度。递归栈的深度取决于树的高度,最坏情况下(树退化为链表)为O(n),平均情况下(平衡二叉树)为O(log n)。
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:int treeDepth(TreeNode* root) {// 递归终止条件:当前节点为空,深度为0if(!root) return 0;// 递归计算左右子树的深度,取最大值加1作为当前节点的深度return max(treeDepth(root->left), treeDepth(root->right)) + 1;}
};
示例演示
示例1:平衡二叉树
输入:3/ \9  20/  \15   7执行过程:
1. treeDepth(3)- treeDepth(9)1- treeDepth(20)- treeDepth(15)1- treeDepth(7)1- max(1, 1) + 1 = 2- max(1, 2) + 1 = 3输出: 3
示例2:左斜树
输入:1/2/3执行过程:
1. treeDepth(1)- treeDepth(2)- treeDepth(3)1- treeDepth(NULL)0- max(1, 0) + 1 = 2- treeDepth(NULL)0- max(2, 0) + 1 = 3输出: 3
示例3:空树
输入: NULL执行过程:
直接返回0输出: 0

扩展
优化1:迭代实现(BFS)

使用广度优先搜索(BFS)来计算树的深度,避免递归栈的开销。

int treeDepth(TreeNode* root) {if (!root) return 0;queue<TreeNode*> q;q.push(root);int depth = 0;while (!q.empty()) {int size = q.size();depth++;for (int i = 0; i < size; i++) {TreeNode* node = q.front();q.pop();if (node->left) q.push(node->left);if (node->right) q.push(node->right);}}return depth;
}

特点

  • 空间复杂度:O(n),最坏情况下队列中存储所有叶子节点
  • 适合深度较大的树,避免递归栈溢出
优化2:迭代实现(DFS)

使用深度优先搜索(DFS)的迭代版本,模拟递归过程。

int treeDepth(TreeNode* root) {if (!root) return 0;stack<pair<TreeNode*, int>> st;st.push({root, 1});int maxDepth = 0;while (!st.empty()) {auto [node, depth] = st.top();st.pop();maxDepth = max(maxDepth, depth);if (node->right) st.push({node->right, depth + 1});if (node->left) st.push({node->left, depth + 1});}return maxDepth;
}

特点

  • 空间复杂度:O(h),h为树高
  • 更接近递归的思路,但使用显式栈
方法时间复杂度空间复杂度适用场景
原始递归O(n)O(h)代码简洁,容易理解
BFS迭代O(n)O(n)适合广度较大的树
DFS迭代O(n)O(h)更接近递归的思路
  1. 递归方法:代码简洁,适合大多数场景,但需要注意递归深度限制
  2. BFS迭代:适合需要层次遍历信息的场景,或担心递归栈溢出时
  3. DFS迭代:适合需要模拟递归过程的场景,空间效率优于BFS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86911.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探秘AI的秘密:leaked-system-prompts

揭秘:揭秘系统提示合集背后的秘密 在当今这个人工智能技术迅速发展的时代,了解和使用大型语言模型(LLM)已成为技术爱好者、开发者和研究人员的共同目标。而作为核心组成部分,系统提示(system prompts)的设计和应用直接影响了LLM的表现和功能。今天, 我们将为大家揭示一…

Gaming Mode四大功能(VRR、QMS、QFT、ALLM)

HDMI 2.1定义的Gaming Mode四大功能&#xff08;VRR、QMS、QFT、ALLM&#xff09;通过协同优化帧传输、刷新率同步与延迟控制&#xff0c;显著提升了游戏和影音的流畅性与响应速度。以下是这些功能的详细解析及其应用价值&#xff1a; &#x1f504; 1. 可变刷新率&#xff08;…

数据库总结(关系代数-函数依赖-范式)

以下是关系代数中基本操作的详细说明&#xff1a; 并&#xff08;Union&#xff09; 关系R和S的并操作表示为R ∪ S&#xff0c;要求R和S具有相同的属性集&#xff08;并相容性&#xff09;。结果包含所有属于R或S的元组&#xff0c;自动去除重复项。 示例&#xff1a; R …

react经验:在nextjs中使用motion组件

什么是motion组件&#xff1f; 一种动画组件 motion组件文档 在nextjs中的应用步骤 1.安装motion npm i framer-motion2.在next.config.js中配置转义 export default {transpilePackages: [framer-motion] }3.开始应用 **注意要点&#xff1a;**在服务端渲染不可直接用&am…

怎样大语言模型 遵守规则

如何让应用中的提示工程更能适应未来变化 目录 如何让应用中的提示工程更能适应未来变化怎样大语言模型 遵守规则提示词 很有效:Memorize these rules提示可分为稳定组件和易变组件怎样大语言模型 遵守规则 实验背景:让大语言模型可靠地遵守规则很难,尤其是规则数量增多时。…

如何通过SSL证书配置防止源站IP泄露 - 全面防护指南

问题背景&#xff1a;SSL证书如何导致源站IP泄露 近期多位站长反馈&#xff0c;即使已部署高防CDN并做好源站IP保密工作&#xff0c;服务器仍频繁遭受DDoS攻击。经深入排查&#xff0c;发现问题根源在于SSL证书。当前网络环境中存在大量爬虫工具24小时不间断扫描全网IP地址&am…

医院信息化发展要经过哪几个阶段

目前&#xff0c;几乎所有的医院都离不开信息技术的建设和支持。没有信息技术&#xff0c;医院的业务可能无法继续。医院信息化的发展主要经历三个阶段&#xff0c;即医院管理信息化阶段、临床管理信息化阶段和医疗智能化阶段。从基础设施的角度来看&#xff0c;每个阶段都有不…

【Vscode】Vscode切换成中文语言

安装中文语言包 启动 VSCode。按下Ctrl Shift X&#xff08;或者点击左侧边栏的扩展图标&#xff09;&#xff0c;打开扩展面板。在搜索框中输入Chinese (Simplified)&#xff0c;在搜索结果里找到Chinese (Simplified) Language Pack for Visual Studio Code并点击安装按钮…

【百日精通JAVA | 数据结构篇】 一文了解泛型体系

一、初识泛型 在推出泛型以前&#xff0c;程序员可以创建一个元素类型Object的集合&#xff0c;该集合能够存储任意的数据类型对象&#xff0c;而在使用该集合的过程中&#xff0c;需要明确知道存储每个元素的类型&#xff0c;否则容易引发ClassCastException异常。 泛型是JD…

赋能 Java 工程,飞算科技重新定义智能开发

在数字经济蓬勃发展的当下&#xff0c;软件开发行业正经历着前所未有的变革。飞算科技作为一家自主创新型的数字科技公司&#xff0c;始终以互联网科技、大数据、人工智能等前沿技术为根基。凭借团队在相关领域多年积累的深厚实践经验&#xff0c;公司深度融合技术与应用&#…

【蓝牙】Linux Qt4蓝牙设备列表刷新加载采用什么策略,使用什么对应的Linux命令或dbus接口

在 Linux 系统中&#xff0c;使用 Qt4 开发蓝牙设备列表刷新功能时&#xff0c;通常会结合 BlueZ 蓝牙协议栈 和 D-Bus 通信机制 实现对蓝牙设备的发现与管理。以下是常见的实现策略和对应的命令或接口。 &#x1f9e9; 一、蓝牙设备列表刷新策略 1. 主动扫描&#xff08;Scan…

产品背景知识——CIFS、SMB 和 Samba

产品背景知识——CIFS、SMB 和 Samba 1. SMB&#xff08;Server Message Block&#xff09; 定义&#xff1a; SMB 是一种网络协议&#xff0c;用于在计算机之间共享文件、打印机、串口等资源。它由 IBM 在 1980 年代开发&#xff0c;后被微软采用并扩展。 发展历程&#xff…

基于Python的GIS-RS多源数据处理(TIF/SHP/NC/...)【20250630】

栅格数据以规则网格(像素)的数值矩阵表达地理现象&#xff0c;每个单元格代表一个属性值(如高程、温度)。例如卫星影像、数字高程模型、温度分布图。存储格式包括ENVI DAT、GeoTIFF、JPEG、PNG、ASCII Grid等等。 矢量数据是通过几何图形(点、线、面)表示地理实体&#xff0c;…

基于yolov5的深度学习的昆虫检测带QT界面

完整项目查看或想了解其他项目点击文末名片 项目简介 本项目旨在开发一个基于深度学习的昆虫检测与识别系统。系统使用两个主要模块&#xff1a;昆虫检测器&#xff08;InsectDetector&#xff09;和昆虫识别器&#xff08;InsectIdentifier&#xff09;。首先&#xff0c;昆虫…

linux使用1

1.终端查看ip地址 # windows ipconfig# linux ifconfig2.VMware共享文件夹权限设置下如何复制/移动文件 # 移动: mv # 查看当前文件夹: ls # 设置管理员权限&#xff1a; sudo # 复制&#xff1a; cp#情景一&#xff1a;移动桌面文件夹&#xff08;desktop/day4/server/)到共…

ACE之ACE_NonBlocking_Connect_Handler问题分析

问题 ACE_NonBlocking_Connect_Handler在处理异步时存在问题 分析 当connect选择的同步参数为ACE_Synch_Options::USE_REACTOR时&#xff0c;连接超时时间为ACE_Time_Value::zero&#xff0c;在同步发起连接返回的错误码为EWOULDBLOCK时&#xff0c;会发起异步连接nonblocki…

『uniapp』i18n 国际化(保姆级图文)

目录 预览效果项目根目录新建i18n文件夹安装vue-i18n 指定版本main.js 中引入i18n页面展示总结欢迎关注 『uniapp』 专栏,持续更新中 欢迎关注 『uniapp』 专栏,持续更新中 预览效果 中文 英文 项目根目录新建i18n文件夹 其中各个语言的json文件

P1967 [NOIP 2013 提高组] 货车运

题目背景 NOIP2013 提高组 D1T3 题目描述 A 国有 n n n 座城市&#xff0c;编号从 1 1 1 到 n n n&#xff0c;城市之间有 m m m 条双向道路。每一条道路对车辆都有重量限制&#xff0c;简称限重。 现在有 q q q 辆货车在运输货物&#xff0c; 司机们想知道每辆车在不…

【软考高项论文】论信息系统项目的沟通管理

摘要 在信息系统项目的实施进程中&#xff0c;沟通管理的重要性不言而喻。有效的沟通不仅能保证项目信息准确传递&#xff0c;还能推动团队协作&#xff0c;提高项目整体效率。本文结合 2024 年 6 月我所参与的信息系统项目&#xff0c;围绕项目沟通管理的过程及项目干系人管理…

浪潮和曙光服务器的ipmi配置教程

配置浪潮SA5212M5服务器 1、启动服务器按DEL按键进入服务器bios 2、选择Server Mgmt菜单中的BMC Network Configuration配置项回车。 3、BMC Network Configuration配置项中的Get BMC Dedicated Parameters选择Manual&#xff08;手动配置&#xff09; 4、BMC Network Configu…