二叉树最近公共祖先相关题目(Leetcode题解-Python语言)

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

class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':def dfs(root: 'TreeNode', p: 'TreeNode', q: 'TreeNode'):# 如果当前节点为空,则说明 p、q 不在 node 的子树中,不可能为公共祖先,直接返回 Noneif not root:return None# 如果当前节点 root 等于 p 或者 q,那么 root 就是 p、q 的最近公共祖先,直接返回 root,不需要遍历子树了if root == p or root == q:return root# 递归遍历左子树、右子树,并判断左右子树结果node_left = dfs(root.left, p, q)node_right = dfs(root.right, p, q)# 如果左右子树都不为空,则说明 p、q 在当前根节点的两侧,当前根节点就是他们的最近公共祖先if node_left and node_right:return rootreturn node_left if node_left else node_rightans = dfs(root, p, q)return ans

在递归函数 dfs 中,我们是先判断 root 是否等于 p 或者 q,再遍历其左右子树,这样可以应对两种情况:1、p 或者 q 在最近公共祖先的两侧,此时由于祖先作为 root 不等于p、q,所以左右子树都会被遍历,从而逐级向上返回,得到祖先的左右子树都不为空,返回 root;2、
p 或者 q 自身就是最近公共祖先,此时满足 root 等于 p 或 q,直接返回 root 即可。

1676. 二叉树的最近公共祖先 IV

class Solution:def lowestCommonAncestor(self, root: 'TreeNode', nodes: 'List[TreeNode]') -> 'TreeNode':def dfs(root: 'TreeNode', nodes: 'List[TreeNode]'):# 如果当前节点为空,则说明 p、q 不在 node 的子树中,不可能为公共祖先,直接返回 None,不需要遍历子树了if not root:return None# 如果当前节点 root 等于 p 或者 q,那么 root 就是 p、q 的最近公共祖先,直接返回 rootfor node in nodes:if root == node:return root# 递归遍历左子树、右子树,并判断左右子树结果node_left = self.dfs(root.left, nodes)node_right = self.dfs(root.right, nodes)# 如果左右子树都不为空,则说明 p、q 在当前根节点的两侧,当前根节点就是他们的最近公共祖先if node_left and node_right:return rootreturn node_left if node_left else node_rightans = dfs(root, nodes)return ans

与上一题同理,此题 p、q 换成了更多的节点,用列表 nodes 表示。

1644. 二叉树的最近公共祖先 II

class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':def dfs(root: 'TreeNode', p: 'TreeNode', q: 'TreeNode'):nonlocal pFlagnonlocal qFlag# 如果当前节点为空,则说明 p、q 不在 node 的子树中,不可能为公共祖先,直接返回 Noneif not root:return None# 递归遍历左子树、右子树,并判断左右子树结果node_left = dfs(root.left, p, q)node_right = dfs(root.right, p, q)# 如果左右子树都不为空,则说明 p、q 在当前根节点的两侧,当前根节点就是他们的最近公共祖先if node_left and node_right:return root# 如果当前节点 root 等于 p 或者 q,那么 root 就是 p、q 的最近公共祖先,返回 root,子树也已经被遍历过了if root == p or root == q:if root == p:pFlag = Trueif root == q:qFlag = Truereturn rootreturn node_left if node_left else node_rightpFlag = FalseqFlag = Falseans = dfs(root, p, q)if not pFlag or not qFlag:return Nonereturn ans

这题需要用两个标志位记录 p 和 q 有没有出现过,如果其中之一没出现过就返回 None。这题的判断 root 是否等于 p 或 q 要放在遍历左右子树的后面,这是因为如果 root 等于 p 或 q 了然后返回,此时只有一个标志位是变成 True 的,但我们要两个标志位都为 True 时才返回 ans。所以我们要先遍历左右子树,再判断 root 的值,这样就会遍历到所有的节点,这种写法在前面两题也可以使用,但是在前面两题的情况下是属于效率低的。

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

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

相关文章

跟我一起学.NetCore之文件系统应用及核心浅析

前言在开发过程中,肯定避免不了读取文件操作,比如读取配置文件、上传和下载文件、Web中html、js、css、图片等静态资源的访问;在配置文件读取章节中有说到,针对不同配置源数据读取由对应的IConfigurationProvider进行读取&#xf…

深度学习入门笔记(1)——导论部分

此笔记来源于 Sebastian Raschka 的 Introduction to Deep Learning 系列课程。 首先介绍的是传统的编程范式,假设我们想实现垃圾邮件识别的功能,传统的方法就是由程序员来找出垃圾邮件的规则并对其进行编程,得到一个垃圾邮件识别的程序。 机…

新版 C# 高效率编程指南

前言C# 从 7 版本开始一直到如今的 9 版本,加入了非常多的特性,其中不乏改善性能、增加程序健壮性和代码简洁性、可读性的改进,这里我整理一些使用新版 C# 的时候个人推荐的写法,可能不适用于所有的人,但是还是希望对你…

深度学习入门笔记(2)—— 感知器

最经典的神经元模型,从左到右依次是:输入、权重、加权和、阈值、输出。加权和又叫做 Net Input,符号为 z,当 z 的值大于阈值时输出 1,小于阈值时输出 0。 实现与门和或门,权重为 1,阈值分别为 1…

创建一个对象时,在一个类当中 静态代码块 和普通代码块构造方法 的顺序?

一:前言须知 普通代码块,在创建对象实例的时候,会被调用,每创建一次,就调用一次静态代码块,在类加载的时候执行,并且只会执行一次类加载的时机: 创建对象实例的时候(new)创建子类实…

ASP.NET Core 基于声明的访问控制到底是什么鬼?

从ASP.NET 4.x到ASP.NET Core,内置身份验证已从基于角色的访问控制(RBAC)转变为基于声明的访问控制(CBAC)。我们常用的HttpContext.User属性ASP.NET 4.0时代是IPrincipal类型,ASP.NETCore现在强化为ClaimsPrincipal类型。本文就一起来看看这难缠的、晦涩…

回溯的问题合集(Leetcode题解-Python语言)

78. 子集 class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:ans []cur []def dfs(i):if i len(nums):ans.append(cur.copy())return# 包括 nums[i]cur.append(nums[i])dfs(i1)# 不包括 nums[i]cur.pop()dfs(i1)dfs(0)return ans要找出所有子集&a…

一个对象的创建流程

一:流程 加载Person类的信息,(也就是加载Person.class文件 只加载一次) 这个就是类加载的几个过程加载 ,将.class文件转化成二进制流加载到JVM的内存的方法区中,并在堆中生成一个Class对象验证准备解析初始化 该实例堆当中开辟空间 每个类的实例都会记得自己是由哪…

RabbitMq如何确保消息不丢失

上篇写了掌握Rabbitmq几个重要概念,从一条消息说起,这篇来总结关于消息丢失让人头痛的事情。网络故障、服务器重启、硬盘损坏等都会导致消息的丢失。消息从生产到消费主要结果以下几个阶段如下图。①生产阶段,生产者创建消息,经过…

LEETCODE PATTERNS Neetcode 刷题记录(Leetcode题解-Python语言)

LEETCODE PATTERNS 官网在这个链接,Neetcode 官网在这个链接 If input array is sorted then 遇到有序数组用二分或双指针 Binary searchTwo pointers If asked for all permutations/subsets then 求排列或子集用回溯 Backtracking If given a tree then 遇到树就用…

蓝桥杯-单词分析

一:题目 题目描述 小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪…

.NET Core 使用 Consul 服务注册发现

Consul是一个用来实现分布式系统服务发现与配置的开源工具。它内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具,使用起来也较为简单。Consul官网:https://www.consul.io开源地…

蓝桥杯-成绩统计

一:题目 题目描述 小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。 如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。 请计算及格率和优秀率,用百分数…

Mosh 的 MySQL 课程编程练习题目与答案

这篇文章是我观看 Mosh 的 MySQL 完整版课程进行题目练习的记录,视频的话去 B 站搜索就能找到,数据库文件的话可以从这里下载。 目录第二章2- SELECT 子句3- WHERE 子句4- 逻辑运算符5- IN 运算符6- BETWEEN 运算符7- LIKE 运算符8- REGEXP 运算符&#…

《ASP.NET Core 真机拆解》 送书活动结果公布

截至2020.09.26 本次送书活动 送福利 | 送书5本 ASP.NET Core 真机拆解 。下面把Top 5的留言截图给大家回顾一下。特别鸣谢作者罗志超提供的图书。以下5位同学将获赠书籍一本:傲慢的上校静阿花阿定傲慢与偏见以上同学请在2020年9月30日24:00之前加小二微…

端口和进程的关系(详解)

一:端口 (1):端口的定义 端口号的主要作用是表示一台计算机中的特定进程所提供的服务。网络中的计算机是通过IP地址来代表其身份的,它只能表示某台特定的计算机,但是一台计算机上可以同时提供很多个服务,如数据库服务、FTP服务(文件传输)、…

跟我一起学.NetCore之静态文件处理的那些事

前言如今前后端分离开发模式如火如荼,开发职责更加分明(当然前后端一起搞的模式也没有完全褪去);而对于每个公司产品实施来说,部署模式会稍有差别,有的会单独将前端文件部署为一个站点,有的会将…

深度学习入门笔记(3)——用梯度下降进行参数更新

首先是对感知器的简单回顾,假设现有的训练集为 D,共有 n 个训练数据,每个数据都有 m 个输入特征和一个输出标签。一个 epoch 就是遍历一次整个训练集,对于每一个训练数据,都计算其预测、计算误差、更新参数。 在一个 e…

Mysql储存引擎

1:储存引擎 MySQL中的数据用各种不同的技术存储在文件(或者内存)中。 这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。 通过选择不同的技术,你能够获得额外的速度或者功能&#xff0c…

Python 使用 ElementTree 解析 XML 文件

关于 XML 文件的简介&#xff0c;看看菜鸟就可以了&#xff0c;链接在此。 假设我们有个存放电影数据的 XML 文件&#xff1a;movies.xml&#xff0c;其内容如下&#xff1a; <?xml version"1.0"?> <collection><genre category"Action"…