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

236. 二叉树的最近公共祖先 (js)

236.二叉树的最近公共祖先(js)

  • 题目描述
  • 关键思路
  • 完整代码

题目描述

236. 二叉树的最近公共祖先

关键思路

如何确保找到的是最近的公共祖先?

关键点1:后序遍历 + 自底向上

  • 遍历顺序是左 → 右 → 根(后序),

  • 递归是从叶子节点“向上”返回的。

  • 所以我们第一次在某个节点发现 pq 分别在左右子树时,这个节点就是最底层的祖先,也就是最近的。

关键点2:只有第一次满足 left && right 才返回该节点

  • 一旦某个节点返回了 left && right,说明:

    • 它的左边找到了一个(比如 p),

    • 它的右边找到了另一个(比如 q),

    • 所以自己就是“分叉点”,再往上找也是祖先,但就不是“最近”的了。

    • 如果上层节点也满足 left && right,说明它是一个“更远的祖先”,但我们已经在底层返回了“最近”的;

  • 我们只返回这第一个分叉点作为最终答案。

  • 这个返回值会一级一级地向上传递,最终在 root 返回。

举个例子:

        A/ \B   C/ \D   E/F
设 p = D,q = F。D 和 F 分别出现在节点 B 的左子树和右子树;所以 B 是 D 和 F 的最近公共祖先;A 虽然也是祖先,但距离更远。递归过程如下:dfs(D) → 返回 Ddfs(F) → 返回 Fdfs(B) → 得到 left = D,right = F,所以返回 Bdfs(A) → 左边返回了 B,右边返回了 null,最终返回 B最终结果是 B,是最近的公共祖先。

想清楚这个问题,也就明确了递归的终止条件和递归返回值的含义,本质上就是一个后序遍历的 dfs。

  • 返回值的含义:
    • 每次返回值代表当前节点为根的子树中,是否包含 pq,或它们的最近公共祖先
    • 如果返回非空,就代表这棵子树“有贡献”。
  • 递归终止条件:
    • node === null 当前子树是空的,表示什么都没找到,返回 null,终止这条分支的递归。
    • node === p || node === q:找到了目标节点之一(p 或 q),直接返回当前节点。这个信息将被上传给上层函数,用于判断祖先位置。

完整代码


var lowestCommonAncestor = function (root, p, q) {function postorder(node, p, q) {if (node === null || node === p || node === q) {return node;}let nodeLeft = postorder(node.left, p, q);let nodeRight = postorder(node.right, p, q);if (nodeLeft && nodeRight) {return node;}return nodeLeft !== null ? nodeLeft : nodeRight;}return postorder(root, p, q);
};
http://www.xdnf.cn/news/14518.html

相关文章:

  • macOS - 根据序列号查看机型、保障信息
  • 【AI驱动网络】
  • 响应式数据可视化大屏解决方案,重构工业交互体验
  • Java开发小知识-获取配置文件的值(转为Java对象)
  • AIGC工具平台-VideoRetalking音频对口型数字人
  • 前端如何禁止用户复制?
  • vue3 el-select @change (val) 多参数传值操作
  • HCIP-数据通信基础
  • swift-14-可选项的本质、运算符重载、扩展
  • 【案例】性能优化在持续集成与持续交付中的应用
  • RPGMZ游戏引擎 如何手动控制文字显示速度
  • 传输层协议UDP/TCP
  • 【linux】bash脚本中括号问题
  • 巧用云平台API实现开源模型免费调用的实战教程
  • Linux嵌入式和单片机嵌入式的区别?
  • 数据库从零开始:MySQL 中的 DDL 库操作详解【Linux版】
  • excel 数据透视表介绍
  • 技术革新赋能楼宇自控:物联网云计算推动应用前景深度拓展
  • 【图像处理入门】11. 深度学习初探:从CNN到GAN的视觉智能之旅
  • Arduino入门教程:11、直流步进驱动
  • C#语言入门-task2 :C# 语言的基本语法结构
  • Oracle 中唯一索引对行锁的影响
  • 【支持向量机】SVM线性可分支持向量机学习算法——硬间隔最大化支持向量机及例题详解
  • 股票心理学习篇:交易的人性弱点 - 频繁交易
  • GNSS介绍
  • 基于React+Express的个人账单管理系统
  • 【Linux手册】进程优先级:操作系统世界里的“资源争夺”
  • Redis 的优势有哪些,它是CP 还是 AP?CAP 理论又是什么?
  • SpringBoot扩展——发送邮件!
  • 医疗低功耗智能AI网络搜索优化策略