最近公共祖先_leetcode No.236 二叉树的最近公共祖先

aeab73f45d3bbaa6d2b69fc2c308580c.png

承接二叉搜索树的最近公共祖先。

题目链接:

二叉树的最近公共祖先 - 力扣(LeetCode)​leetcode-cn.com
edefff6bb6374150e6b6c48fc879bc7e.png

题目描述:

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

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

例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

3cd740486fc8a7d405be26395196e87c.png

示例 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。因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉树中。

解题思路:

在二叉搜索树的最近公共祖先一题中,树是一个二叉搜索树,我们可以很容易知道应该往哪个方向去找节点的位置。但是本题就是一棵普通的数,应该怎么来求解呢?

我们肯定还是要先找到两个节点的位置,再去判断他俩的祖先,用 DFS 就可以了,那具体应该怎么做呢?

我们先看 p, q 是不是根节点,如果是根节点就是最近公共祖先,我们就返回根节点。如果不是,我们分别在左、右子树中查找是否包含 p 或 q,有两种情况:左子树包含 p,右子树包含q;左子树包含 q,右子树包含 p),那么此时的根节点还是最近公共祖先。

而如果左子树包含 p 和 q(往右找的返回值为空),那么到 root->left 中查找,最近公共祖先在左子树里面。

如果右子树包含 p 和 q(往左找的返回值为空),那么到 root->right 中查找,最近公共祖先在右子树里面。

代码如下:

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (!root || root==p || root==q) {return root;}TreeNode* left = lowestCommonAncestor(root->left, p, q);TreeNode* right = lowestCommonAncestor(root->right, p, q);if(!left) return right;if(!right) return left;return root;}
};

如果有任何疑问,欢迎提出。如果有更好的解法,也欢迎告知。

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

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

相关文章

python methodtype_Python的实例定属性和方法或类绑定方法

一、给实例对象绑定属性和方法:1、给实例绑定属性:先定义一个Student类#!/usr/bin/pythonclass Student(object):pass然后绑定属性:s Student()s.name AAA # 动态给实例绑定一个属性print(s.name)#输出AAA2、给实例绑定方法:先定…

oracle 时间间隔,ORACLE JOB间隔时间参考

关键字: oracle job 间隔时间 trunc假设你的存储过程名为PROC_RAIN_JM再写一个存储过程名为PROC_JOB_RAIN_JM内容是:Create Or Replace Procedure PROC_JOB_RAIN_JM Is li_jobno Number; Begin DBMS_JOB.SUBMIT(li_jobno,PROC_RAIN_JM;,SYSDATE,TRU…

canvas画布会黑屏吗_Android SurfaceView 黑屏问题

说一个真实的案例。其中需求要做一个绘图功能,一听到绘图,自然而然就像到了SurfaceView这个类。所以我就用了。android:layout_width"match_parent"android:layout_height"match_parent"android:orientation"vertical" &g…

oracle连续周数,详细讲解Oracle数据库的“周数计算”

详细讲解Oracle数据库的“周数计算”以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!——日期计算 算第n周的第一天及最后一天是几号 by keynes—— ww的算法为每年 月 日为第一周开始 date …

probe request帧结构_WLAN 无线网络 09 - 管理帧

0000,Association request:关联请求帧认证成功后,STA就会进入关联阶段, 这个交互的目的是为了加入这个BSS 并获取一个AID。通过Association Request携带的信息,使AP了解STA的相关能力信息,这样 AP就可以决定…

oracle 31640,导数据时ora-31640报错

单实例数据库10.2.0.4,目标数据库11.2.0.3 rac,目标准备将单实例上的数据导入到rac数据库。在导入过程中报错如下:Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA. . imported "LBSBUS"."T_MSG_SEND_DETAIL" …

oracle rman备份spfile,RMAN备份恢复之SPFILE的恢复(一)

缺少初始化文件,数据库是无法启动的。如果通过RMAN备份了初始化参数,那么可以通过RMAN对初始化参数进行恢复。这篇文章简单介绍CATALOG方式下初始化参数的恢复问题。初始化参数的丢失和损坏,并不会造成太严重的问题,即使是最坏的情…

c# 获取路径的盘符_c#获取驱动器盘符

在编写某些Windows管理应用程序时,能够从自定义的驱动器选择列表框中进行选择无疑是非常专业的,使用Delphi或者C的早期版本时我们都必须使用Win32所提供的许多关于获取磁盘信息的API函数来分别获取像卷标、序列号以及剩余空间等信息,现在我们…

php fckeditor demo,如何使用PHP添加fckeditor

[更新答案]你需要把你的fckeditor代码放在 标签而不是在顶部。此外,$_POST["FCKEditor"]需要放进去$oFCKeditor->Value变量。这样做:它在我的机器上工作正常,并在fckeditor文本区域内显示格式化的HTML:EditorTitle : include("fckeditor.php");$sBaseP…

php 命名空间通俗易懂_PHP进阶由浅入深掌握面向对象开发

视频教程出自黑马程序员PHP基础_由浅入深掌握面向对象开发【讲解方式】系统梳理和分解知识,各个点逐步讲解,由浅入深,通俗易懂,层层深入【课程亮点】1,已经完成PHP基础知识学习的朋友有帮助2,生动形象&…

qt读oracle时间戳,QT利用QDateTime获取当前时间戳的方法toTime_t

1.toTime_t()把2014年12月19日10:24:40这样的QDateTime的格式转变为1418955940这样的时间戳QDateTime time QDateTime::currentDateTime(); //获取当前时间int timeT time.toTime_t(); //将当前时间转为时间戳2.与toTime_t()功能相反的是fromTime_…

怎么查看父子级目录linux,如何查找linux中特定父目录的所有文件?

如何在linux命令终端中找到具有特定父目录的所有文件?我知道找到所有的文件,使用这样查找:find . -name filename.extension但是可以找到所有filename.extension文件与父目录的文件夹名吗?我尝试了以下操作,但这不行:find . -name…

如何在matlab里输入复杂公式_在MATLAB作图中输出漂亮的公式

函数语法效果语法效果语法效果\sin\theta\cos\theta\tan\theta\arcsin\frac{L}{r}\arccos\frac{T}{r}\arctan\frac{L}{T}\sinh g\cosh h\tanh i\operatorname{sh}j\operatorname{argsh}k\operatorname{ch}h\operatorname{argch}l\operatorname{th}i\operatorname{argth}mk(x)\l…

ln -s命令 linux,Linux下 ln -s 软链接用法

NAMEln - make links between filesSYNOPSISln [OPTION]... TARGET [LINK_NAME]ln [OPTION]... TARGET... DIRECTORYln [OPTION]... --target-directoryDIRECTORY TARGET...软链接用法是: ln -s 实际存在的目标目录 链接名称(不存在的) 。[rootDMDIDATAGUARD /]# cd…

cryptapi双向认证_[加密解密]CryptoAPI简介

CryptoAPI概述Windows CryptoAPI是Microsoft 公司提出的安全加密应用服务框架,也是PKI推荐使用的加密 API。它提供了在Win32 环境下使用认证、编码、加密和签名等安全服务时的标准加密接口,用于增强应用程序的安全性与可控性。应用开发者可以在不了解复杂…

vue前后分离session实现_vue2 前后端分离项目ajax跨域session问题解决

最近学习使用vuejs前后端分离,重构一个已有的后台管理系统,遇到了下面这个问题:实现跨域请求时,每次ajax请求都是新的session,导致无法获取登录信息,所有的请求都被判定为未登陆。1、 vuejs ajax跨域请求最…

win10时间和linux不同步时间,ubuntu16和windows10的时间同步问题

一句话搞定sudo hwclock --localtime --systohc命令: hwclock全称: hardware clock硬件时钟作用: Query or set the hardware clock.Functions:-h, --help show this help text and exit-r, --show read hardware clock and print result--get re…

linux直接用iso文件装服务,linux系统安装iso文件方法

摘要:linux系统下怎么安装iso文件?安装步骤:1、在/mnt目录下,创建相应的iso文件夹,例如iso。2、运行以下命令,挂载iso文...安装步骤:1、在/mnt目录下,创建相应…

smbus协议的command_SMBus总线概述

1.概述:系统管理总线是一种两线制接口。它基于I2C 总线原理演变而来,可以认为是简化版的I2C总线。SMBus最初是应用到智能电池,如电池充电器和一个微控制器。其提供一个系统和电源管理相关的任务控制总线。如今,SMBus总线可以连接的…

在电脑上显示未知发布者怎么办_电脑提示未知发布者 - 卡饭网

IE浏览器提示未知发布者安全警告怎么办IE浏览器提示未知发布者安全警告怎么办 IE浏览器提示未知发布者安全警告的解决方法, IE浏览器提示未知发布者怎么办?安下小编就来分析一下. 1.打开IE浏览器,从右上角打开Internet选项; 2.点击切换到"高级"选项卡; 3.在设置列表…