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

devtools/2024/10/17 20:23:48/

代码解决

/*** 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;// 递归查找左子树中的 LCATreeNode* left = lowestCommonAncestor(root->left, p, q);// 递归查找右子树中的 LCATreeNode* right = lowestCommonAncestor(root->right, p, q);// 如果左子树和右子树都不为空,说明 p 和 q 分别在当前节点的两侧,当前节点是 LCAif(left != NULL && right != NULL) return root;// 如果左子树为空,右子树不为空,说明 LCA 在右子树if(left == NULL && right != NULL){return right;}   // 如果左子树不为空,右子树为空,说明 LCA 在左子树else if(left != NULL && right == NULL){return left;}else{// 左子树和右子树都为空,说明没有找到 LCAreturn NULL;}}
};

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

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

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

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


http://www.ppmy.cn/devtools/51060.html

相关文章

大数据的定义特点与应用场景?

背景 互联网信息化技术高速发展,企业生产过程中产生的数据量呈指数级上升。我们看一组统计: 1986年,全球只有0.02EB也就是约21000TB的数据量 2007年,全球就是280EB也就是约300000000TB的数据量,翻了14000倍 2012年,每天会产生2.5EB的数据量 基于IDC的报告预测,从2013年…

EasyRecovery2024最新免费手机微信聊天记录数据恢复神器!

今天我要给大家种草一款神奇的软件——EasyRecovery!🎉🎉 你是不是曾经遇到过文件丢失、电脑崩溃、硬盘损坏等让人抓狂的问题?😭😭别担心,EasyRecovery就是你的救星! 🌟&…

大模型应用实战1——GLM4的原理与应用(用大模型做游戏npc制作)

目前大模型有两种用法: 开源大模型(llama):整个模型都给你和在线大模型(gpt):只给你调用方法,推荐后者,效果好且方便,适合入门,唯一问题可能有数…

植物大战僵尸杂交版全新版v2.1解决全屏问题

文章目录 🚋一、植物大战僵尸杂交版❤️1. 游戏介绍💥2. 如何下载《植物大战僵尸杂交版》 🚀二、解决最新2.1版的全屏问题🌈三、画质增强以及减少闪退 🚋一、植物大战僵尸杂交版 《植物大战僵尸杂交版》是一款在原版《…

C++ 贪心算法——跳跃游戏、划分字母区间

一:跳跃游戏 55. 跳跃游戏 题目描述:给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 true &#xff1…

理解DDD设计

DDD的理解 领域驱动设计(Domain-Driven Design,DDD)是一种软件开发方法论,强调将业务领域作为软件设计的核心,以便更好地满足业务需求。DDD认为,软件开发的核心是理解业务,而不是实现技术。在D…

LVS+Keepalived高可用负载均衡群集

目录 一.高可用群集相关概述 1.高可用(HA)群集与普通群集的比较 普通群集 高可用群集(HA) 两者比较 2.Keepalived高可用方案 3.Keepalived的体系模块及其作用 4.Keepalived实现原理 二.LVSKeepAlived高可用负载均衡集群的…

mysql的索引可以分为哪些类型

MySQL的索引是用于提高查询性能的重要数据结构。不同类型的索引在不同的使用场景中具有不同的优势和适用性。 1. 主键索引(Primary Key Index) 特点:唯一且不允许 NULL 值。用途:唯一标识表中的每一行。自动创建:定义…