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

leetcode236-二叉树的公共祖先

leetcode 236
在这里插入图片描述

思路

由于我们遍历一个二叉树都是从上往下遍历的,这里要找公共祖先,我们希望的是从下往上遍历,这要怎么实现呢?
如果了解二叉树的遍历就知道,如果使用后序遍历:左右中,就是先拿到左右节点再一层层往上返回的,那么我们本题解答也需要利用到后序遍历来实现
另外我们使用递归法进行后序遍历,那么终止条件是什么呢?
由于我们需要找到公共组件,所以如果我们找到了p节点或q节点时,我们就应该进行记录,所以这种情况要把root返回,还有一种情况就是遍历到了叶子节点的左右节点,root为空,此时也要终止遍历
左右递归遍历的话相信大家都不陌生了,但是因为我们要拿到上次遍历的结果来做判断,所以需要有个值来接受,我们定义left和right来接受到值,当出现p或者q的时候,那么我们的left或者right就是不为空的,如果左右都不为空,那说明当前节点为公共祖先
如果left为空,right不为空呢?
left为空,right不为空,这时候right的父节点需要接受到right的值,所以需要把right向上返回
left不为空,right为空也是同理,这样一层层向上返回得到的就是最大公共祖先

情况二

在这里插入图片描述
像示例2这样,可能存在p是q的公共祖先,其实按照前面的解答也是有涵盖的,当遍历到p的时候发现root === p,那么我们就直接return root,此时p后序的节点都不会遍历,然后再一层层的把p往上抛出,最终拿到的值就是p节点

实现

var lowestCommonAncestor = function(root, p, q) {
    const deep = (root)=>{
        if(root === p || root === q || !root) return root;
        // 左
        const left = deep(root.left)
        // 右
        const right = deep(root.right)
        // 中
        if(left && right) return root;
        if(left && !right) return left;
        if(!left && right) return right;
    }
    return deep(root);
};

http://www.kler.cn/a/590951.html

相关文章:

  • Django REST Framework中的序列化器类和视图类
  • 基于深度学习的OCR+NLP,医疗化验单智能识别方案
  • MPC算法路径跟踪_Matlab实现
  • HTML基础内容2
  • C#运算符与表达式:从入门到游戏伤害计算实践
  • debian12.9 kde切到x11安装搜狗输入法遇到的问题
  • Docker Compose 和 Kubernetes(K8s)对比
  • 工作记录 2017-02-03
  • redis十大应用数据类型具体使用及其应用
  • 蓝桥杯每日五题第一日
  • 每日学习Java之一万个为什么(待补充)
  • LeetCode算法题(Go语言实现)_04
  • 【AVRCP】蓝牙协议栈深度解析:AVCTP互操作性核心机制与实现细节
  • 安全帽二维码:如何提升施工现场的安全管控效果
  • linux 命令 touch
  • 提示词工程化学习,方便用于dify
  • .NET8使用EF Core连接SQLite
  • Shell脚本中的弱治简写
  • 紧急通知:某平台泄露充电桩财富公式!5台×120kW=1.3年回本,年利润34.3万!速删前收藏 - 慧知开源充电桩平台
  • 234.回文链表