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。本题不仅考察了对二叉树的理解,还考察了递归算法的应用以及边界条件的处理。希望读者能够通过本题加深对二叉树和递归算法的理解,并在未来的编程实践中灵活运用这些知识。

相关推荐
skilllite作者几秒前
SkillLite Rust 沙箱与 AI Agent 自进化实战指南
开发语言·人工智能·后端·架构·rust
我星期八休息几秒前
Linux 进程核心原理全解:从冯诺依曼体系到进程控制全链路深度剖析
大数据·linux·服务器·开发语言·数据结构·c++·散列表
QCzblack1 分钟前
php-ser-libs
android·开发语言·php
xin_nai4 分钟前
LeetCode热题100(Java)(3)滑动窗口
算法·leetcode·滑动窗口
Cando学算法4 分钟前
回声服务器项目
linux·开发语言·c++·计算机网络·ubuntu
宝耶4 分钟前
[特殊字符] 操作日志模块复习笔记
java·开发语言·jvm
不想写代码的星星5 分钟前
我写的代码竟然敢和我比摸鱼?C++ 延迟计算那些事儿
c++
好好研究5 分钟前
Java基础学习(十三):IO流基础
java·开发语言·学习·io流
知识分享小能手13 分钟前
R语言入门学习教程,从入门到精通,R语言传统绘图系统 - 完整知识点与案例代码(2)
开发语言·学习·r语言
代龙涛18 分钟前
WordPress archive.php 分类与归档页面开发指南
开发语言·后端·php·wordpress