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

相关推荐
JS_GGbond3 分钟前
用美食来理解JavaScript面向对象编程
开发语言·javascript·美食
buyue__6 分钟前
C++实现数据结构——队列
数据结构·c++
Hui Baby7 分钟前
LSM 原理、实现及与 B+ 树的核心区别
java·linux·算法
NZT-488 分钟前
C++基础笔记(二)队列deque,queue和堆priority_queue
java·c++·笔记
艾上编程12 分钟前
第三章——爬虫工具场景之Python爬虫实战:行业资讯爬取与存储,抢占信息先机
开发语言·爬虫·python
β添砖java20 分钟前
python第一阶段第10章
开发语言·python
爬山算法24 分钟前
Netty(13)Netty中的事件和回调机制
java·前端·算法
CoovallyAIHub31 分钟前
是什么支撑L3自动驾驶落地?读懂AI驾驶与碰撞预测
深度学习·算法·计算机视觉
玉树临风ives38 分钟前
atcoder ABC436 题解
c++·算法·leetcode·atcoder·信息学奥赛
fpcc40 分钟前
C++23中的自定义模块开发
c++·c++23