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),因为需要存储递归调用的栈。

相关推荐
RTC老炮19 分钟前
webrtc弱网-RobustThroughputEstimator源码分析与算法原理
网络·算法·webrtc
听风吹等浪起35 分钟前
分类算法-逻辑回归
人工智能·算法·机器学习
敲代码的嘎仔37 分钟前
JavaWeb零基础学习Day2——JS & Vue
java·开发语言·前端·javascript·数据结构·学习·算法
yacolex1 小时前
3.3_数据结构和算法复习-栈
数据结构·算法
茉莉玫瑰花茶1 小时前
动态规划 - 两个数组的 dp 问题
算法·动态规划
微笑尅乐2 小时前
从暴力到滑动窗口全解析——力扣8. 字符串转换整数 (atoi)
算法·leetcode·职场和发展
火花怪怪2 小时前
LaMer结晶动力学模型
算法
legendary_bruce2 小时前
【22.2 增强决策树】
算法·决策树·机器学习
老马啸西风3 小时前
力扣 LC27. 移除元素 remove-element
算法·面试·github
数智顾问3 小时前
中秋特别篇:使用QtOpenGL和着色器绘制星空与满月——从基础框架到光影渲染
算法