Featured image of post Lowest Common Ancestor Of A Binary Tree

Lowest Common Ancestor Of A Binary Tree

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

分析

  1. 使用递归深度优先搜索(DFS)

    • 状态定义:
      • 如果某个子树中找到了 p ,则返回状态 1
      • 如果找到了 q ,则返回状态 2
      • 如果同时找到 pq,状态为 3
    • 递归逻辑:
      • 对当前节点的左右子树分别进行递归
      • 将左右子树的状态结果与当前节点的状态进行合并(按位或操作)
      • 如果当前节点的状态等于 3 且最近公共祖先 res 尚未被赋值,则更新 res
  2. 终止条件

    • pq 在同一个子树中时,递归会找到它们最近的公共祖先并停止
    • 如果两个节点在不同子树中,递归逻辑会找到分叉点,即最近公共祖先

时间复杂度

时间复杂度 O(n),其中 n 是二叉树的节点总数,每个节点访问一次

空间复杂度

空间复杂度为 O(h),其中 h 是二叉树的高度,递归调用栈的深度

C++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution
{
public:
    TreeNode* res = nullptr; // 存储最近公共祖先节点

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
    {
        dfs(root, p, q); // 执行深度优先搜索
        return res; // 返回最近公共祖先
    }

    int dfs(TreeNode* root, TreeNode* p, TreeNode* q)
    {
        int state = 0; // 当前节点的状态
        if (!root)
            return state; // 如果当前节点为空,返回状态 0
        if (root == p)
            state |= 1; // 如果找到节点 p,更新状态为 1
        else if (root == q)
            state |= 2; // 如果找到节点 q,更新状态为 2

        // 递归左右子树
        state |= dfs(root->left, p, q);
        state |= dfs(root->right, p, q);

        // 如果当前状态为 3(即同时找到 p 和 q),且 res 尚未更新,更新 res
        if (state == 3 && !res)
            res = root;

        return state; // 返回当前节点的状态
    }
};
Built with Hugo
Theme Stack designed by Jimmy