184.二叉树:二叉树的最近公共祖先(力扣)

代码解决

cpp 复制代码
/**
 * 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:
    // 函数用于寻找二叉树中节点 p 和 q 的最低公共祖先
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) 
    {
        // 如果当前节点为空,直接返回空
        if(root == NULL) return root;

        // 如果当前节点是 p 或者 q,直接返回当前节点
        if(root == p || root == q) return root;

        // 递归查找左子树中的 LCA
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        // 递归查找右子树中的 LCA
        TreeNode* right = lowestCommonAncestor(root->right, p, q);

        // 如果左子树和右子树都不为空,说明 p 和 q 分别在当前节点的两侧,当前节点是 LCA
        if(left != NULL && right != NULL) return root;

        // 如果左子树为空,右子树不为空,说明 LCA 在右子树
        if(left == NULL && right != NULL)
        {
            return right;
        }   
        // 如果左子树不为空,右子树为空,说明 LCA 在左子树
        else if(left != NULL && right == NULL)
        {
            return left;
        }
        else
        {
            // 左子树和右子树都为空,说明没有找到 LCA
            return NULL;
        }
    }
};

代码使用了递归的方法。主要思路是首先判断根节点是否为空,如果为空,返回空。然后,判断根节点是否等于给定的两个节点中的任意一个,如果是,返回根节点。否则,递归地在左子树和右子树中寻找这两个节点,如果两个节点分别在左右子树中找到,则根节点即为最低公共祖先;如果一个节点在左子树中找到,另一个在右子树中找到,则根节点不是最低公共祖先;如果一个节点都没有找到,则根节点也不是最低公共祖先。

这里简要解释一下代码的工作流程:

  1. 首先判断根节点是否为空,如果为空,返回空。
  2. 判断根节点是否等于给定的两个节点中的任意一个,如果是,返回根节点。
  3. 递归地在左子树中寻找节点p和q,同时记录结果。
  4. 递归地在右子树中寻找节点p和q,同时记录结果。
  5. 检查左右子树的结果:
    • 如果左右子树都找到了节点,则根节点即为最低公共祖先,返回根节点。
    • 如果左子树找到了一个节点,右子树没有找到,则返回左子树的结果。
    • 如果右子树找到了一个节点,左子树没有找到,则返回右子树的结果。
    • 如果左右子树都没有找到节点,则返回空。

这个算法的时间复杂度是 O(n),其中 n 是树中节点的数量。在最坏的情况下,可能需要遍历整个树来找到最低公共祖先。空间复杂度也是 O(n),因为需要存储递归调用的栈。

相关推荐
江畔柳前堤4 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore5 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考6 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX7 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面8 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号8 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽8 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI8 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者10 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者10 小时前
【征程6】校准量化中HistogramObserver解析
算法