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

LeetCode 543 二叉树的直径

二叉树的直径:树中任意两个节点间最长路径的长度。这个路径可能经过根节点,也可能不经过。

算法思路

采用深度优先搜索(DFS)的后序遍历方式,计算每个节点的左右子树高度,并在过程中更新最大直径。

代码解析

var diameterOfBinaryTree = function(root) {let ans = 0  // 用于记录当前找到的最大直径const dfs = (node) => {if (node === null) {return 0  // 空节点的高度为0}// 递归计算左右子树的高度const lLen = dfs(node.left)const rLen = dfs(node.right)// 更新最大直径:当前节点作为"转折点"时的路径长度ans = Math.max(ans, lLen + rLen)// 返回当前节点的高度(左右子树中较高的那个 + 1)return Math.max(lLen, rLen) + 1}dfs(root)  // 从根节点开始遍历return ans
};

关键点解释

  1. 后序遍历:先处理左右子树,再处理当前节点,这确保了在计算当前节点时,其子树的信息已经计算完成。

  2. 高度计算:对于每个节点,我们计算其左右子树的高度:

    • lLen 是左子树的高度
    • rLen 是右子树的高度
  3. 直径更新:直径是通过某个节点的最长路径,这个路径长度等于左子树高度 + 右子树高度。我们不断用这个值更新全局最大值 ans

  4. 返回值:每个节点返回的是以它为根的子树的高度,这是为了父节点能够计算它自己的直径。

示例分析

考虑以下二叉树:

      1/ \2   3/ \     4   5    

计算过程:

  1. 节点4:lLen=0, rLen=0 → ans=0, 返回1
  2. 节点5:lLen=0, rLen=0 → ans=0, 返回1
  3. 节点2:lLen=1(来自4), rLen=1(来自5) → ans=2, 返回2
  4. 节点3:lLen=0, rLen=0 → ans=2, 返回1
  5. 节点1:lLen=2(来自2), rLen=1(来自3) → ans=3, 返回3

最终直径为3(路径[4,2,1,3]或[5,2,1,3]的长度)

时间复杂度

  • 时间复杂度:O(n),其中n是树中的节点数。每个节点只被访问一次。
  • 空间复杂度:O(h),其中h是树的高度。这是递归调用栈的空间消耗。

相关文章:

  • 【模型显著性分析】配对样本 t 检验
  • uniapp小程序开发,判断跳转页面是否需要登录方法封装
  • 从SEO到GEO:搜索范式迁移的三大断层
  • 教师申报书课题——项目名称: 基于DeepSeek-R1与飞书妙记的课堂话语智能分析实践计划
  • 遥控器主副控设计运行要点分析!
  • 即插即用!全新记忆回溯策略:一种元启发式算法的进化更新机制,含完整免费MATLAB代码
  • 便携式遥测自跟踪天线
  • 第十五届蓝桥杯大赛软件赛国赛Python 大学 C 组试做【本期题单: 设置密码、栈】
  • 第十章 Java基础-Static静态变量
  • Unity数字人开发笔记——讯飞超拟人语音
  • Python人工智能算法学习 禁忌搜索算法求解旅行商问题(TSP)的研究与实现
  • 央国企迁移国产数据库:数据迁移5步法与4项管理准则
  • 【周输入】517周阅读推荐-3
  • opencv + jpeg_turbo(启用SIMD加速)
  • 【每天一个知识点】LangChain
  • 消息队列从入门到实战:用外卖订单理解高并发系统的核心设计
  • AMBA-AHB的控制信号
  • 水域应急救援可视化平台
  • Ai书签管理工具开发全记录(一):项目总览与技术蓝图
  • c/c++的opencv图像金字塔缩放
  • 武汉外贸网站制作/兰州网站seo诊断
  • 如何查询网站已经提交备案/商丘seo推广
  • 一个网站要怎么做的吗/百度搜索推广怎么做
  • 做网站月收入/b站视频推广网站
  • 陕西网站建设哪家好/北京seo技术
  • 惠安网站建设/搜索引擎营销的内容