LeetCode 543:二叉树直径的高效解法与JS实现
1. 题目理解与需求分析今天要解决的是LeetCode第543题二叉树的直径。这是一道经典的二叉树遍历问题题目描述很简单给定一棵二叉树你需要计算它的直径长度。二叉树的直径是指树中任意两个结点间最长路径的长度这条路径可能穿过也可能不穿过根结点。举个例子对于这样一棵二叉树1 / \ 2 3 / \ 4 5它的直径是3因为最长路径是[4,2,1,3]或者[5,2,1,3]路径长度都是3边数。1.1 关键点解析这里有几个关键点需要明确直径的定义是基于边数的不是节点数。比如上面例子中路径包含4个节点但边数是3。最长路径不一定经过根节点。比如下面这棵树1 / \ 2 3 / \ 4 5 / \ 6 7/8 9最长路径是[8,6,4,2,5,7,9]长度是6完全不经过根节点1。 3. 对于空树直径是0。 ## 2. 解题思路与算法选择 ### 2.1 暴力解法分析 最直观的想法是对于树中的每一对节点计算它们之间的距离然后取最大值。这种方法的时间复杂度是O(n²)因为树中有n个节点就有n(n-1)/2对节点每对节点的距离计算需要O(n)时间。对于较大的树这种解法显然不够高效。 ### 2.2 优化思路 更聪明的做法是利用二叉树的性质。我们可以观察到 - 任何一条路径都可以看作是从某个节点出发向左子树走一段再向右子树走一段。 - 对于每个节点来说经过它的最长路径长度 左子树深度 右子树深度。 因此我们可以 1. 对树进行后序遍历先处理左右子树再处理当前节点 2. 对于每个节点计算它的左右子树深度 3. 维护一个全局变量记录最大直径 4. 当前节点的深度 max(左深度, 右深度) 1 这样每个节点只需要访问一次时间复杂度降为O(n)空间复杂度是O(h)h是树的高度递归栈空间。 ## 3. JavaScript实现详解 ### 3.1 基础实现 javascript function diameterOfBinaryTree(root) { let maxDiameter 0; function depth(node) { if (!node) return 0; const leftDepth depth(node.left); const rightDepth depth(node.right); maxDiameter Math.max(maxDiameter, leftDepth rightDepth); return Math.max(leftDepth, rightDepth) 1; } depth(root); return maxDiameter; }3.2 代码解析我们定义了一个maxDiameter变量来记录全局最大直径。depth函数是一个递归函数它计算以当前节点为根的子树的最大深度。在计算深度时我们同时更新maxDiameter当前节点的直径左子树深度右子树深度。最后返回maxDiameter作为结果。3.3 边界情况处理空树直接返回0只有根节点返回0因为没有边单边树所有节点只有左子树或只有右子树直径等于节点数-14. 复杂度分析与优化4.1 时间复杂度每个节点只被访问一次所以时间复杂度是O(n)n是节点数量。4.2 空间复杂度空间复杂度取决于递归栈的深度最坏情况下树退化为链表是O(n)平均情况下是O(logn)。4.3 可能的优化虽然递归解法已经很简洁但我们也可以考虑用迭代法实现避免递归带来的栈空间开销。不过对于JavaScript来说递归解法在大多数情况下已经足够高效。5. 常见错误与调试技巧5.1 常见错误混淆直径和深度直径是基于边数的而深度是基于节点数的。容易把leftDepth rightDepth 1当作直径这是错误的。忘记处理空树的情况。没有正确维护全局最大直径可能在递归中丢失了最大值。5.2 调试技巧对于小树可以手动计算预期结果与程序输出对比。打印中间结果可以在递归函数中加入console.log查看每个节点的左右深度和当前直径。使用可视化工具如LeetCode提供的二叉树可视化功能直观理解树的结构。6. 扩展思考6.1 相关问题掌握了这道题后可以尝试解决以下类似问题LeetCode 124. 二叉树中的最大路径和LeetCode 687. 最长同值路径LeetCode 1372. 二叉树中的最长交错路径6.2 实际应用这种树形结构的直径计算在实际中有很多应用网络拓扑中计算最远两个节点间的距离组织结构图中计算最大沟通距离文件系统中目录结构的深度分析6.3 算法变种如果题目改为求最长路径上的节点数解法也很类似只需要调整直径的计算方式。或者如果路径需要满足某些特定条件如路径上所有节点值相同也可以在递归过程中加入额外的判断逻辑。7. 个人心得在实际编码中我发现这类树形DP问题有几个关键点明确递归函数的定义这里depth函数返回的是深度但副作用是更新最大直径处理好递归的终止条件空节点返回0在递归过程中维护全局状态maxDiameter注意区分边数和节点数的计算对于JavaScript实现还需要注意使用let而不是var声明maxDiameter避免变量提升带来的问题递归函数最好定义在外部函数内部可以访问外部变量现代JS引擎对递归优化较好但极端情况下极深树可能还是需要考虑迭代解法

相关新闻

Python爬虫实战:漏洞库数据抓取与MySQL入库全流程

Python爬虫实战:漏洞库数据抓取与MySQL入库全流程

简介:这是一份面向网络安全初学者与Python爬虫实践者的综合项目源码包,围绕CNVD、CNNVD、CVE三大权威漏洞库的数据采集、存储与可视化展开,适合想打通爬虫、数据库与GUI开发链路的学习者。包内共72个文件,以py脚本、toc与spec打包…

2026/10/14 0:50:56 阅读更多 →
虚拟商城系统模块化拼装:八套模块选型与支付交付实战

虚拟商城系统模块化拼装:八套模块选型与支付交付实战

简介:友价在线虚拟商城最新版是一套面向源码交易、域名交易等虚拟商品买卖场景的综合性电商系统,适合个人站长、开发者及中小团队快速搭建可运营的交易平台。系统采用模块化设计,涵盖商品管理、订单处理、用户管理、支付接口集成与安全保障等…

2026/10/14 0:50:56 阅读更多 →
Python 3.6.5 Linux离线安装全攻略:从依赖到虚拟环境

Python 3.6.5 Linux离线安装全攻略:从依赖到虚拟环境

简介:这份资源是面向Linux离线环境的Python 3.6.5集成安装包,专为内网服务器、无外网权限或需要快速搭建Python开发环境的用户准备。包内已集成NumPy、Pandas、TensorFlow 1.10等科学计算与机器学习库,Django 2.1、djangorestframework 3.8、…

2026/10/14 0:50:56 阅读更多 →

最新新闻

参数估计实战:从数学公式到工程落地的七道关卡

参数估计实战:从数学公式到工程落地的七道关卡

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 1:40:10 阅读更多 →
CSS边框内圆角实现方案:解决高保真UI的像素级痛点

CSS边框内圆角实现方案:解决高保真UI的像素级痛点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 1:40:10 阅读更多 →
多媒体实验报告:图像音频视频处理与参数避坑指南

多媒体实验报告:图像音频视频处理与参数避坑指南

简介:本资源是一份面向计算机及相关专业本科生的Authorware多媒体实验报告,记录“文字的滚动效果”的完整实现过程,重点讲解显示、等待、运动、擦除等图标在动态文字展示中的组合应用。报告按实验步骤展开,包含背景与文字导入、移…

2026/10/14 1:40:10 阅读更多 →
3天从85%降到20%!这3个AI智能降重工具让我顺利通过盲审

3天从85%降到20%!这3个AI智能降重工具让我顺利通过盲审

还记得上周三凌晨两点,当我第三次收到知网AIGC检测报告时,手心都在冒汗——85%的AI相似度,40%的查重率,这意味着我的毕业论文根本达不到盲审要求。导师直接在我的初稿上批注“学术合规性存疑,建议重写”。距离最终答辩…

2026/10/14 1:40:10 阅读更多 →
QPdfium集成指南:Qt PDF渲染内核配置与踩坑实战

QPdfium集成指南:Qt PDF渲染内核配置与踩坑实战

简介:这是一份面向Qt开发者的PDF功能集成库,基于Google pdfium开源引擎封装,专为MSVC2017 64位环境编译。它可将PDF页面渲染为QImage,便于在Qt程序中解析、显示和处理PDF文档,适合需要快速为桌面应用添加PDF阅读、打印…

2026/10/14 1:40:10 阅读更多 →
DSO编译运行实战:从环境配置到参数调优全解析

DSO编译运行实战:从环境配置到参数调优全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 1:39:10 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →