C++算法练习-day45——236.二叉树的最近公共祖先

题目来源:. - 力扣(LeetCode)

题目思路分析

题目要求在一个二叉树中找到两个给定节点的最低公共祖先(Lowest Common Ancestor, LCA)。最低公共祖先是指在树中同时包含两个给定节点的所有节点中,深度最大的那个节点。这意味着从该节点出发,能够同时到达这两个给定的节点。

思路

  1. 递归搜索:利用递归遍历树的每个节点,判断给定的两个节点是否在当前节点的左右子树中。
  2. 边界条件
    • 如果当前节点为空,或者当前节点就是给定的节点之一,直接返回当前节点。
    • 如果在左子树中找到了一个节点,而在右子树中没有找到另一个节点,则左子树的返回值即为LCA;反之亦然。
    • 如果在两个子树中都找到了这两个节点,那么当前节点即为LCA。

代码:

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) {  
        // 边界条件:如果当前节点为空,或者当前节点就是p或q,返回当前节点  
        if(!root || root == p || root == q){  
            return root;  
        }  
          
        // 在左子树中递归查找p和q的LCA  
        TreeNode* left = lowestCommonAncestor(root->left, p, q);  
          
        // 在右子树中递归查找p和q的LCA  
        TreeNode* right = lowestCommonAncestor(root->right, p, q);  
          
        // 如果左子树返回null,说明p和q都在右子树中,返回右子树的结果  
        if(!left){  
            return right;  
        }  
          
        // 如果右子树返回null,说明p和q都在左子树中,返回左子树的结果  
        if(!right){  
            return left;  
        }  
          
        // 如果左右子树都不为空,说明p和q分别位于当前节点的左右两侧,当前节点即为LCA  
        return root;  
    }  
};

知识点摘要

  1. 二叉树的基本概念:节点、左子树、右子树、根节点等。
  2. 递归算法:通过函数调用自身来解决问题,特别适合树结构的问题。
  3. 边界条件处理:在递归中处理各种可能的边界情况,确保算法的正确性。

通过本题,我们学会了如何在二叉树中利用递归方法找到两个节点的最低公共祖先。这种方法的核心在于通过递归遍历树的每个节点,并判断给定的两个节点是否在当前节点的左右子树中。根据这个判断,我们可以确定当前节点是否是LCA。本题不仅考察了对二叉树的理解,还考察了递归算法的应用以及边界条件的处理。希望读者能够通过本题加深对二叉树和递归算法的理解,并在未来的编程实践中灵活运用这些知识。

相关推荐
rit843249935 分钟前
基于MATLAB的模糊图像复原
开发语言·matlab
fie888940 分钟前
基于MATLAB的声呐图像特征提取与显示
开发语言·人工智能
未来之窗软件服务1 小时前
自己写算法(九)网页数字动画函数——东方仙盟化神期
前端·javascript·算法·仙盟创梦ide·东方仙盟·东方仙盟算法
豐儀麟阁贵1 小时前
基本数据类型
java·算法
_extraordinary_2 小时前
Java SpringMVC(二) --- 响应,综合性练习
java·开发语言
Larry_Yanan3 小时前
QML学习笔记(三十四)QML的GroupBox、RadioButton
c++·笔记·qt·学习·ui
@。1243 小时前
对于灰度发布(金丝雀发布)的了解
开发语言·前端
程序员老舅3 小时前
干货|腾讯 Linux C/C++ 后端开发岗面试
linux·c语言·c++·编程·大厂面试题
乐迪信息3 小时前
乐迪信息:基于AI算法的煤矿作业人员安全规范智能监测与预警系统
大数据·人工智能·算法·安全·视觉检测·推荐算法
程序员Aries3 小时前
自定义网络协议与序列化/反序列化
linux·网络·c++·网络协议·程序人生