代码随想录算法训练营第二十三天|617.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

617.二叉搜索树的最小绝对差

文档讲解:代码随想录

题目链接:. - 力扣(LeetCode)

遇到二叉搜索树,就要知道这棵树在中序遍历的情况下是一个升序的遍历。

这道题目的难点就是如何使用双指针遍历二叉树,一个指向中序遍历的正在遍历的节点,一个指向中序遍历前一个结点

在中序遍历过程中,遍历到的节点是不断递增的,相当于有一个指针是不断移动的,我们只要让另一个指针指向现在指针指向的指针就可以

如何确定递归函数有无返回值:有返回值的情况:返回二叉树是否符合某一特性或者某一结点的数值,遍历某条特定的路径,或是找到某一结点,本题是需要遍历整个二叉树所以无返回值

class Solution:def __init__(self):self.result = float("inf")self.pre = Nonedef traversal(self,root):if not root:return self.traversal(root.left) #向左遍历#中if self.pre is not None: self.result = min(self.result,root.val - self.pre.val)self.pre = root#右self.traversal(root.right)def getMinimumDifference(self, root: Optional[TreeNode]) -> int:self.traversal(root)return self.result

501.二叉搜索树中的众数

文档讲解:代码随想录

题目链接:. - 力扣(LeetCode)

涉及到二叉搜索树,遍历顺序一定是中序遍历,中序遍历的才是一个升序数组。然后将处理逻辑放在中间,和上一个题的结构是一样的,在向左遍历和向右遍历中间写上处理代码。

难点:众数可能有多个

所以我们要对每个不一样的元素都初始化一个count,比较哪个count最大,并且如果有跟count一样大的其他元素对应的count,那么这两个元素都是众数

代码技巧①和上一题一样,也是使用双指针 ②定义两个频率变量,一个是当前遍历的元素的频率count,一个是所有的遍历过的元素的最高频率max_count  ③收获结果集:如果count和max_count 一样,就保存到结果集中 ④在遍历的过程中不断更新max_count,以及结果集

class Solution:def findMode(self, root: Optional[TreeNode]) -> List[int]:###定义全局变量pre = Nonecount = 0max_count = 0result = []def traversal(root):nonlocal pre, count, max_count, resultif not root:return traversal(root.left)#统计当前节点的频率if pre == None:count = 1else:if pre.val == root.val:count +=1else:count = 1#比较当前节点的频率和最大频率if count > max_count:max_count = countresult = [root.val] #重置###下面这个条件不可以写为if,这个条件和上面的是互斥的,如果写为if那么上面那个执行完之后,max_count = count了,下面的if条件还是会执行elif  count == max_count:result.append(root.val)##不要忘记更新pre的值pre = roottraversal(root.right)traversal(root)return result

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

文档链接:代码随想录

题目链接:. - 力扣(LeetCode)

审题:

  • 所有 Node.val 互不相同 。
  • p != q
  • p 和 q 均存在于给定的二叉树中。

如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。也就是我们要从下往上处理

 遍历是没有办法从下往上遍历的,但是处理顺序可以从下往上处理,后序遍历,左右中,便是从下往上处理。有递归就会有回溯,回溯的过程就会让我们从底往上去遍历

class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':if root == None or root.val == p.val or root.val == q.val: #如果一个节点是根节点,那么不论另一个节点在哪里,最近公共祖先都是该根节点return rootleft = self.lowestCommonAncestor(root.left,p,q)right = self.lowestCommonAncestor(root.right,p,q)if left and right:return rootif left and not right:return leftelif not left and right:return rightelse:return None

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

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

相关文章

三条命令快速配置Hugging Face

大家好啊,我是董董灿。 本文给出一个配置Hugging Face的方法,让你在国内可快速从Hugging Face上下在模型和各种文件。 1. 什么是 Hugging Face Hugging Face 本身是一家科技公司,专注于自然语言处理(NLP)和机器学习…

写爬虫代码抓取Asterank中小行星数据

2024年5月4日 问题来源 解决方案 回顾2023年7月14日自己写的爬虫代码 import requests import re import pandas as pd texts[] def getData(page):#每页评论的网址urlhttps://item.jd.com/51963318622.html#comment#添加headers,伪装成浏览器headers{User-Agent:…

即插即用 | YOLOv8热力图可视化方法详解,揭秘AI如何「看」世界!【附完整源码】

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

常见的前端框架

常用的前端框架有以下几种: 模型 React:由Facebook开发的一款前端框架,采用虚拟DOM的概念,可高效地更新页面。Vue.js:一款轻量级的前端框架,易学易用,支持组件化开发和双向数据绑定。AngularJ…

接口框架项目实战-pytest(四)请求封装接口关联

把所有的请求方法集中到一个地方 目的:利于后期维护和加入日志 异常处理 等 目的:框架封装好之后,功能测试不需要写代码,也能执行自动化测试 config.yml base:base_php_url: http://47.107.116.139base_wx_url: https://api.weix…

vivado 低级别 SVF JTAG 命令、多链 SVF 操作

多链 SVF 操作 以下示例显示了如何在 SVF 链上处理操作。 每个链中连接有 2 个器件 : xcku11 和 xcku9 。配置存储器连接到链中的第 2 个器件 (xcku9) 。为访问此配置存储器 , SVF 会使用 HIR 、 HDR 、 TIR 和 TDR 命令来生成命令。为刷写此…

路由模块封装

目录 一、问题引入 二、步骤 一、问题引入 随着项目内容的不断扩大,路由也会越来越多,把所有的路由配置都堆在main.js中就不太合适了,所以需要将路由模块抽离出来。其好处是:拆分模块,利于维护。 二、步骤 将路由相…

小巧简单实用的Linux端口转发工具Rinetd

Linux下实现端口转发有很多种方法,尤其是在可以联网的情况下,更是容易。最近在资源受限的定制系统中,找到一个方便离线安装和使用的端口转发工具Rinetd,安装包仅几十K,而且有很多版本的Linux发行系统的支持。 1、安装…

Spring底层入门(九)

boot的执行流程分为构造SpringApplication对象、调用run方法两部分 1、Spring Boot 执行流程-构造 通常我们会在SpringBoot的主启动类中写以下的代码: 参数一是当前类的字节码,参数二是main的args参数。 public class StartApplication {public static…

解决jar包中没有主清单目录的问题

文章目录 解决jar包中没有主清单目录的问题问题描述环境描述方法一 | 阿里巴巴构造器的通用解决方案方式二 | 指定MANIFEST.MF路径 解决jar包中没有主清单目录的问题 问题描述 很简单可能很多人都遇到过,maven项目打成jar包后执行报错:jar包中没有主清单…

揭秘:深度学习与自然语言处理的本质差异

在人工智能的广阔天地中,深度学习与自然语言处理犹如两颗耀眼的明星,各自绽放着光芒。尽管它们时常在科技文章中齐头并进,但它们的核心区别与联系常常令人迷惑。如果你希望一次性搞懂这两个人工智能领域的差异和联系,那么本文将是…

2024OD机试卷-数组连续和 (java\python\c++)

题目:数组连续和 题目描述 给定一个含有N个正整数的数组, 求出有多少个连续区间(包括单个正整数), 它们的和大于等于x。 输入描述 第一行两个整数N x(0 < N <= 100000, 0 <= x <= 10000000) 第二行有N个正整数(每个正整数小于等于100)。 输出描述 输出一…

Spring Security 入门 2

1.项目实战 就以RuoYi-Vue 为例吧&#xff0c;主要以下几点原因&#xff1a; 基于 Spring Security 实现。 基于 RBAC 权限模型&#xff0c;并且支持动态的权限配置。 基于 Redis 服务&#xff0c;实现登录用户的信息缓存。 前后端分离。同时前端采用 Vue &#xff0c;相对来…

ai可以做思维导图吗?当然是可以的!

ai可以做思维导图吗&#xff1f;在快节奏的现代生活中&#xff0c;思维导图作为一种高效的信息组织和表达工具&#xff0c;越来越受到人们的青睐。随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;AI思维导图软件也应运而生&#xff0c;它们不仅能够帮助用户…

Qt | QValidator 抽象类(验证器)及其子类|QDoubleValidator 类|QIntValidator 类

01、上节回顾 Qt | QComboBox(组合框)Qt | QLineEdit 类(行编辑器)02、QValidator 1、QValidator 类直接继承自 QObject 类,且是一个抽象类,因此具体功能主要由其子类来实现,或者子类化该类实现自定义的验证器。 2、验证器的作用是验证用户输入的

Orange3数据可视化(小提琴图)

小提琴图 小提琴图和箱线图类似&#xff0c;用来显示数据分布和概率密度。结合了箱线图和密度图的特征&#xff0c;用来显示数据的分布形状。 输入 数据: 输入数据集 输出 选中的数据: 从图中选中的实例 数据: 增加了一列&#xff0c;显示数据点是否被选中 …

k8s DaemonSet

DaemonSet 是k8s节点上的守护进程。 ReplicaSet 和 DaemonSet 的区别&#xff1a; ReplicaSet 部署在不同节点上的 pod 是随机分布的。DaemonSet 部署在不同节点上的 pod 的数量是刚好一个的&#xff0c;因此DaemonSet 不需要期望数量。 DaemonSet 将 pod 部署到集群中的所有…

java随机生成6位验证码,首位不能是0

在Java中&#xff0c;要随机生成一个6位的验证码&#xff0c;其中首位不能为0&#xff0c;可以使用以下代码示例&#xff1a; import java.util.Random;public class VerificationCodeGenerator {public static void main(String[] args) {System.out.println(generateVerific…

three.js 效果细节提升

1. three.js 效果细节提升 加载模型时&#xff0c;给模型设置接受阴影&#xff0c;反射阴影 gltfLoader.load("./model/court-transformed.glb", (gltf) > {gltf.scene.traverse(child > {if (child.isMesh) {child.castShadow true; // 设置阴影可以投射阴…

【Linux】yum与vim

文章目录 软件包管理器&#xff1a;yumLinux安装和卸载软件包Linux中的编辑器&#xff1a;vimvim下的底行模式vim下的正常模式vim下的替换模式vim下的视图模式vim下的多线程 软件包管理器&#xff1a;yum yum其实就是一个软件,也可以叫商店 和你手机上的应用商店或app store一…