算法:二叉树的公共祖先

题目

函数:

java 复制代码
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
 
    }
}

思路

  1. 定义递归函数的含义

    • 我们设计一个递归函数,比如 find(node, p, q)
    • 这个函数的任务不是直接返回最终答案,而是返回它在以 node 为根的子树中的查找结果
    • 查找结果有三种可能:
      a. 在这棵子树里找到了 p
      b. 在这棵子树里找到了 q
      c. 在这棵子树里同时找到了 pq(这意味着我们已经找到了LCA)。
      d. 什么都没找到。
  2. 后序遍历的思考方式

    • 要判断当前节点 nodep, q 的关系,我需要先知道我的左子树右子树的查找结果。这就是典型的"后序遍历"思维------先处理子节点,再处理父节点。
  3. 在当前节点 node 做出决策

    • 我向我的左子树 node.left 发出询问:find(node.left, p, q),得到左边的查找结果 left_result
    • 我向我的右子树 node.right 发出询问:find(node.right, p, q),得到右边的查找结果 right_result
    • 现在,我作为 node 节点,手握 left_resultright_result 这两条信息,开始分析:
      • 情况A:左边找到了一个,右边也找到了一个 (left_result 找到了p, right_result 找到了q,或者反之)。
        • 这意味着什么?pq 分别位于我的两侧!那我 node 不就是它们相遇的第一个节点吗?我就是它们的最近公共祖先!问题解决,我就是答案。
      • 情况B:左边找到了 p 或 q,但右边什么也没找到
        • 左子树返回的结果 left_result 其实就是它那边找到的LCA或者目标节点p或q,我只需要把这个结果继续向上传递给我的父节点就行。
      • 情况C:右边找到了,左边没找到
        • 和情况B同理,我把 right_result 向上汇报。
      • 情况D:我自己 (node) 就是 p 或者 q
        • 根据定义,一个节点可以是自己的祖先。那我就是我这棵子树里能找到的最高的目标节点。我直接把自己作为结果向上汇报,都不用再问我的子树了。

代码

java 复制代码
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null) return null;
        if(root.val == p.val || root.val == q.val) return root;
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        if(left!=null&&right!=null) return root;
        else if(left!=null) return left;
        else if(right!=null) return right;
        else return null; 
    }
}
相关推荐
小白程序员成长日记2 小时前
2025.11.23 力扣每日一题
算法·leetcode·职场和发展
16_one3 小时前
autoDL安装Open-WebUi+Rag本地知识库问答+Function Calling
人工智能·后端·算法
散峰而望4 小时前
C++数组(三)(算法竞赛)
开发语言·c++·算法·github
q***95224 小时前
SpringMVC 请求参数接收
前端·javascript·算法
初级炼丹师(爱说实话版)5 小时前
多进程与多线程的优缺点及适用场景总结
算法
hetao17338375 小时前
2025-11-25~26 hetao1733837的刷题记录
c++·算法
历程里程碑5 小时前
各种排序法大全
c语言·数据结构·笔记·算法·排序算法
少许极端5 小时前
算法奇妙屋(十四)-简单多状态dp问题
算法·动态规划·图解算法·简单多状态dp·打家劫舍问题·买卖股票问题全解
2301_823438026 小时前
解析论文《复杂海上救援环境中无人机群的双阶段协作路径规划与任务分配》
人工智能·算法·无人机