Leetcode:236. 二叉树的最近公共祖先(C++)

news2024/11/21 2:23:29

目录

问题描述:

实现代码与解析:

原理思路:


问题描述:

        给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

示例 2:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。
因为根据定义最近公共祖先节点可以为节点本身。

示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1

实现代码与解析:

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) 
    {
        if(root==NULL) return NULL;
        if(root==p) return p;
        if(root==q) return q;
        TreeNode* left=lowestCommonAncestor(root->left,p,q);
        TreeNode* right=lowestCommonAncestor(root->right,p,q);
        //找到公共祖先返回
        if(left==p&&right==q||left==q&&right==p) return root;
        //已经找到祖先,就返回祖先,只找到一个结点,返回其此结点,两个结点都未找到,返回NULL
        return left?left:right;    
    }   
};

原理思路:

        比较简单啊,就直接写解题过程了,这里用的是递归。

        1、首先确定终止条件,很明显,当我们遇到了NULL或者pq这两个结点就返回。

if(root==NULL) return NULL;
if(root==p) return p;
if(root==q) return q;

        2、然后就是递归逻辑,很明显,这题需要左右子树的返回信息,所以用后序遍历来处理。

TreeNode* left=lowestCommonAncestor(root->left,p,q);
TreeNode* right=lowestCommonAncestor(root->right,p,q);
.........
//后序处理代码

        3、之后就是后序的处理代码了,当该结点的子树返回了q结点,子树返回了p结点或者左右换一下顺序,子树返回了p结点,子树返回了q结点,我们就返回该根结点。

//找到公共祖先返回
if(left==p&&right==q||left==q&&right==p) return root;

        4、最后这步是重点了,虽然代码简单,但是其很精妙,处理了很多种情况,先把代码放出来,然后再给出解答。

return left?left:right;

种情况:

        qp当前均未找到时,这行代码会返回NULL,符合逻辑。

种情况:

        qp当前只找到了一个时,这行代码返回非空的(也就当前找到的那个),符合逻辑。

种情况:

        qp的祖先已经找到了,当前结点的左右子树有一颗返回了祖先,有一颗返回了NULL,这行代码返回非空的(也就是祖先),符合逻辑。

种情况:

        qp子树的某个结点或pq子树的某个结点,这时,qp自己就为其祖先,由终止条件可知,此情况下,遇到祖先就返回了,祖先的根节点,就符合第种情况,返回了祖先,符合逻辑。

        所以别看这行代码短,但是却为这题的关键所在,大家在写题时也要把所有情况都考虑到,思考如何用最简单的代码来表达出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/162765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xmanager7远程登录ubuntu20.04

Xmanager7远程登录ubuntu20.04 本文不介绍Xmanager7的下载和安装方法,详细内容可以参考【实用软件】Xmanager 7.0安装教程 - 哔哩哔哩 (bilibili.com)。关于Xmanager7远程登录的教材参考于 (149条消息) Xmanager远程桌面教程_周先森爱吃素的博客-CSDN博客_xmanage…

代码随想录第60天|84.柱状图中最大的矩形

84.柱状图中的最大的图形 总体思路:找到左右两个方向第一个小于该柱子高度的下标,用右下标-左下标-1得到该柱子高度对应的宽度w,再用宽度w*高度h得到面积,返回面积最大值 双指针法(超时) for循环判断左右第一个小于…

【NI Multisim 14.0虚拟仪器设计——虚拟仪器的引入】

目录 序言 前言 🍉知识点 一、虚拟仪器的引入 🍊1.工具栏 🍊 2.基本操作 ①仪器的选用与连接 ②仪器参数的设置 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电…

Linux云服务器下的gitee提交代码方法

目录 创建一个gitee仓库 gitee提交代码三板斧 1. git add 提交的文件 2. git commit -m "提交日志" 3. git push 可能存在的问题 .gitignore介绍 如何删除文件 创建一个gitee仓库 gitee提交代码三板斧 1. git add 提交的文件 作用:添加我…

Electron + React 应用打包全流程

(第一次用 Typora 写博,希望效果不错~) 这几天有个创意编程比赛,要写一个电脑端应用。我准备用 React.js Electron 做(因为熟悉~),编程部分一路风雨无阻,到了打包却出现了问题。El…

多轮对话(一):概述(意图识别+槽填充)

一、对话系统 基于流水线的面向任务的对话系统包含了四个关键部分: 语言理解。它被称为自然语言理解(NLU),它把用户话语解析为预定义的语义槽。对话状态跟踪器。它管理每一轮的输入与对话历史,输出当前对话状态。对话…

Sechunter移动应用隐私合规检测详解

概述: 受益于移动设备的广泛普及,移动应用近年来得到了蓬勃发展。基于移动设备集成的各类传感器,众多功能丰富的移动应用被开发出来,聚集了大量高价值用户隐私数据,包括用户身份信息、地理位置信息、账户资料信息等。…

玩转机密计算从 secGear 开始

随着网络与计算业务的快速发展,数据成为数字经济的关键生产要素,如何高质量挖掘数据价值,构建安全、合规、可信的数据流通,成为推动数字经济健康发展的关键。此外,根据我国个人信息保护法、欧盟通用数据保护条例 GDPR …

IDEA安装使用代码提交模板

IDEA安装使用代码提交模板 1. idea安装git commit template插件 2、重启idea 3、选择要提交的文件右击(或CtrlShiftK),如下图: 3.1 Type of change用于说明commit的类别,常用的标识如下: feat: 新功能(f…

501. 二叉搜索树中的众数

501. 二叉搜索树中的众数 难度简单 给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按 任意顺序 返…

Effective C++条款38:通过复合塑模出 has-a 或“根据某物实现出“

Effective C条款38:通过复合塑模出 has-a 或"根据某物实现出"(Model "has-a" or "is-implemented-in-terms-of" through composition)条款38:通过复合塑模出 has-a 或"根据某物实现出"1、…

Batch Normalization

1、原理 在图像预处理过程中会对图像进行标准化处理,这样能够加速网络的收敛速度。 如下图所示,对于Conv1来说输入的是满足某一分布的特征矩阵,但对于Conv2来说输入的feature map就不一定满足某一分布规律。 Batch Normalization的目的就是使…

大坝安全在线监控系统包含哪些内容?怎样提升水库大坝信息化管理水平?

平升电子大坝安全在线监控系统根据SL551-2012《土石坝安全监测技术规范》的整编要求,设置了变形监测、渗流监测、环境量监测。大坝安全在线监控系统可及时了解大坝的工作性态和水库可能存在的事故隐患,为大坝安全管理与水库运行调度提供了准确、及时的现…

Elasticsearch集群搭建

前言在如今的开发过程中,单节点的Elasticsearch肯定是支撑不了大数据量的,而且还存在单节点故障的问题,所以Elasticsearch也提供了集群功能,像其他中间件也基本都会考虑到这个问题准备信息首先, 由于我机器有限&#x…

如何在虚拟机上安装Linx系统

前言作为Java开发的我们,可能有时候想自己玩玩linux服务器,但是如果买阿里云或者腾讯云的服务器又很贵,这时候我们就可以在自己电脑上安装虚拟机了,这也是本篇文章出现的原因,下面我就安装centOS7为例子来进行介绍首先…

openEuler资源利用率提升之道 05:虚机混部介绍与功耗管理技术

随着云计算市场规模的快速增长,各云厂商基础设施投入也不断增加,但行业普遍存在资源利用率低的问题,在上述背景下,提升资源利用率已经成为了一个重要的技术课题。将业务区分优先级混合部署(下文简称混部)是典型有效的资源利用率提…

【C语言】使用C语言实现静态、动态的通讯录(简单易懂)

我们在学习结构体之后,就可以尝试去实现通讯录的制作,如果您这边对于结构体还没有太多的认识的话,请先访问这一篇文章,会有利于接下来的学习。【自定义类型】带你走进结构体、枚举、联合_小王学代码的博客-CSDN博客 目录 一、通讯录 二、静…

JVM-【面试题】-对象内存分配

一、对象内存分配流程图如果能在栈分布就直接在栈创建如果是大对象就直接在old区创建如果不大于TLAB则在TLAB创建,否则在Eden区创建如果Eden区空间不足就会发生Minor GC进行回收,回收的空间放不下或年龄达到上限就直接放到Old区,之后S0区的存…

Vue3.0 性能提升主要是通过哪几方面体现的?

一、编译阶段 回顾Vue2,每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把用到的数据property记录为依赖,当依赖发生改变,触发setter,则会通知watcher,从而使关联的组件重新渲染 试想一下&…

34420A万用表

18320918653 34420A Agilent 34420A 七位半台式数字万用表|安捷伦纳伏表34420A|微欧表|安捷伦34420A 品牌: Agilent(安捷伦) 1.3nV rms噪声/8n Vp-p 100pV,100nΩ灵敏度 两通道可编程电压输入:差分和比值功能 71/2位分辨率 1mV到100V量程…