• 力扣235和236 二叉树的最近公共祖先问题


    236. 二叉树的最近公共祖先 - 力扣(LeetCode)

    • 二叉树查找最近公共祖先

      • 普通二叉树从底向上查找,后续遍历是天然的回溯
      • 递归三部曲:
        • 1.确认递归函数返回值和参数
          • 需要返回是否是目标结点,首先考虑到返回布尔值;
          • 如果找到了目标结点也可以直接返回目标节点,则可以通过返回的结点是否为空来判断是否找到了目标结点。
          • 参数:下一个结点,目标结点1 ,目标结点2
        • 2.确认结束条件:
          • 若当前结点为空,则返回空;
          • 若当前结点不为目标结点,则返回空;
          • 若当前结点为目标结点,则返回该目标结点;
        • 确认单层递归逻辑(达到对应条件返回对应的值)
          • 根据每个左右结点的返回值进行判断
          • 1.左右结点返回值都不为空,则当前结点为最近公共祖先
          • 2.若左结点为空,右结点不为空,返回右结点值
          • 3.若右结点为空,左结点不为空,返回左结点值
          • 4.若都为空,则返回空

    代码:

    1. // 后续遍历是天然的回溯:从树的底层向上寻找
    2. var lowestCommonAncestor = function (root, p, q) {
    3. // 使用递归的方法
    4. // 需要从下到上,所以使用后序遍历
    5. // 1. 确定递归的函数
    6. const travelTree = function (root, p, q) {
    7. // 2. 确定递归终止条件
    8. if (root === null || root === p || root === q) {
    9. return root;
    10. }
    11. // 3. 确定递归单层逻辑
    12. let left = travelTree(root.left, p, q);
    13. let right = travelTree(root.right, p, q);
    14. if (left != null && right != null) return root;
    15. if (left == null && right != null) {
    16. return right;
    17. } else if (left != null && right == null) {
    18. return left;
    19. } else { // (left == null && right == null)
    20. return null;
    21. }
    22. }
    23. return travelTree(root, p, q);
    24. };

     235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)

    • 二叉搜索树的最近公共祖先

      • 二叉搜索树是有序的,根结点的左子树都比根结点小,根结点的右子树都比根结点大
      • 利用二叉搜索树有序的特性,从上到下遍历二叉搜索树
      • 从上到下的遍历:因为本题是没有中间结点的处理逻辑的,所以采用哪种遍历顺序都无所谓
      • 通过当前结点的值是否在目标结点区间去判断该结点是否为最近公共祖先
        • 1.若当前结点的值比俩个目标结点的值都小,就要往右子树找
        • 2.若当前结点的值比俩个目标结点的值都大,就要往左子树找
        • 3.当前结点的值在俩个目标结点的中间,则该结点为最近公共祖先
        • 4.如果当前结点为空 返回空

    代码:

    1. var lowestCommonAncestor = function(root, p, q) {
    2. if(root === null) return root;
    3. if(root.val > p.val && root.val > q.val) {
    4. let left = lowestCommonAncestor(root.left, p, q);
    5. if(left!==null) {
    6. return left;
    7. }
    8. }
    9. if(root.val < p.val && root.val < q.val) {
    10. let right = lowestCommonAncestor(root.right, p, q);
    11. if(right!==null) {
    12. return right;
    13. }
    14. }
    15. return root;
    16. };

     

     

  • 相关阅读:
    微调大型语言模型(一):为什么要微调(Why finetune)?
    JAVA+MySQL 图书馆借阅信息管理系统
    Qt的线程(两种QThread类的详细使用方式)「建议收藏」
    阿里云ack集群升级流程
    Conda的自动化魔法:一探auto_activate_base的奥秘
    C#关于set()和get()方法的理解及使用
    理解中国经济的五层思维-中国视角下的宏观经济
    R语言使用马尔可夫链对营销中的渠道归因建模
    ATFX汇市:英国通胀率大降两个百分点,GBPUSD止步近两月高点
    国内真正称得上好用的低代码开发平台有哪些?
  • 原文地址:https://blog.csdn.net/qq_59181609/article/details/125530040