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

LeetCode HOT100 - 二叉树的最近公共祖先

第一时间想的实际上是倍增,就是对于每个节点,记录它的 \(2^k\) 级祖先,查询 LCA 的时候让它们先跳到同一深度,接着再逐步向父节点移动

但是这样需要去预处理,并且这里是直接给出了函数和传进来的数据结构,所以换个角度考虑

怎么转换角度呢,如果考虑怎么去实现,那实际上还是一开始提到的思路

但是想到树的结构本身就是子结构或者同构问题,适合动态规划或者分治

这里我们要编写的函数的作用是在根为 root 的树中,找 p, q 的 LCA

考虑 p, q 可能的分布

  • 一个在左子树,一个在右子树
  • 两个都在左子树
  • 两个都在右子树

对于第一种情况,显然 LCA 就是 root

对于第 2 、3 种情况,我们的结果等价于在根为 root 的左/右儿子 中,找 p, q 的 LCA

接着我们思考如何去刻画这一个关系,因为我们需要一个统一的策略,去处理 1,2,3

延续上面提到的思想,尝试把这个任务丢给左子树,右子树,也就是

        TreeNode *l = lowestCommonAncestor(root->left, p, q);TreeNode *r = lowestCommonAncestor(root->right, p, q);

如果是情况 2 ,那么 r 会是 nullptr ,返回 l ,反之亦然
如果是情况 1, 那么 l 和 r 都会是 nullptr,这时候返回 root

现在剩下递归边界情况

如果 root 已经是 nullptr ,自然返回 root;特殊一点的,如果 root 恰好是 p, q ,那么显然 LCA 是 root

/*** 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:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == nullptr || root == p || root == q) {return root;}TreeNode *l = lowestCommonAncestor(root->left, p, q);TreeNode *r = lowestCommonAncestor(root->right, p, q);if(l == nullptr) {return r;}if(r == nullptr) {return l;}return root;}
};

另外在翻看别人的代码时发现 nullptr 或者说是否为空的判断可以写的更简单一些,也就是类似于判断是否为 0 的形式

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (!root || root == p || root == q) {return root;}TreeNode* left = lowestCommonAncestor(root->left, p, q);TreeNode* right = lowestCommonAncestor(root->right, p, q);if (left && right) {return root;}if (left) {return left;}return right;}
http://www.jsqmd.com/news/491896/

相关文章:

  • 互联网大厂Java面试:从基础到高并发的深度解析
  • AI 编程3:LangGraph 实现 Orchestrator-Worker(编排器 - 工作者)工作流-test6
  • eVTOL动力电驱系统功率链路设计实战:效率、功率密度与可靠性的高空平衡之道
  • ngx_nonblocking
  • 深度解析:Redis 预扣减与 RabbitMQ 异步解耦,如何完美平衡延迟与一致性?
  • 科技中介机构如何优化技术交易流程?
  • 创建型,结构型,行为型设计模式全面比较
  • 双机热备/高可用架构中常见的一个网络问题
  • 春秋云境CVE-2019-13396
  • 堆内存和栈空间对任务创建的影响
  • 深入理解计算机系统:CPU 里面根本没有减法器?揭秘计算机的 0 和 1 是如何计算的
  • 2.Adobe Animate散件、绘制对象、组、元件
  • 2026年除甲醛品牌TOP10揭晓:谁才是真正靠谱的行业首选?
  • 排土场在线监测厂家核心竞争力对比:2026高性价比品牌推荐 - 深度智识库
  • Win10/11系统中检测电池健康的工具有哪些?
  • 【ABAP】ALV 指定单元格染色
  • LeetCode Hot 100——贪心部分
  • spaCy v2.0:自定义流水线组件与扩展属性实战
  • 赋能智慧电厂:一块开发板如何重塑能源安全巡检的底层逻辑
  • 相比高防IP,为什么现在的游戏公司更倾向于选择“湘情盾”?
  • 2026年全国精密传动设备供应商选型测评:行星减速机与中空旋转平台综合指南 - 深度智识库
  • 从标准件到定制化:2026车床刀座选型全流程指南与品牌推荐 - 品牌推荐大师1
  • Linux 基础IO (五)深入理解文件系统
  • 国产化编辑器如何扩展KindEditor的Excel公式导入?
  • 将文本转化为向量化表示
  • ansys apdl 车轨耦合车桥耦合 列车模型:考虑车体、转向架、车轮质量和二系悬挂 钢轨
  • 计算机毕业设计springboot高校学生党员信息管理系统 基于SpringBoot的高校党建信息化管理平台 基于SpringBoot的智慧校园党员服务系统
  • 全志H618
  • ceph提供rbd存储
  • 飞函私有化,安全重塑跨部门协作