【代码随想录】【二叉树】补day21:二叉搜索树的最小绝对差 、二叉搜索树中的众数 、二叉树的最近公共祖先

最小绝对差

1.申请一个数组,比较两两之间最小的差值

 def getresult3(self,node:TreeNode):self.nums=[]self.getMinimumDifference(node)mindifference=float('inf')for i in range(len(self.nums)-1):mind=self.nums[i+1]-self.nums[i]if mindifference>mind:mindifference=mindreturn mindifferencedef getMinimumDifference(self,node:TreeNode):if node is None:returnself.getMinimumDifference(node.left)self.nums.append(node.val)self.getMinimumDifference(node.right)

2.不申请数组,利用双指针解法

 def getMinimumDifference2(self,node:TreeNode):self.pre=None   # 双指针解法,当前node与pre的差值self.result=float('inf')def dfs(node:TreeNode):if node is None:return# 中序遍历:左dfs(node.left)# 中的逻辑,让result保存最小的差值if self.pre is not None:self.result=min(self.result,abs(node.val-self.pre.val))# 此时pre等于当前current节点,而current节点已经回溯到上一层self.pre=node# 右dfs(node.right)

二叉搜索树中的众数

有序二叉树里面的众数,因为是有序的,也就意味着只有相邻两个元素的值会相等,所以才能通过依次比较相邻的两个元素值是否相同的方式来递增times

1.不申请额外空间,动态更新result

  def getMaxFrequency(self,node:TreeNode):self.result=[]  # z存放众数的结果集self.times=1self.maxtimes=0self.pre=Nonedef dfs(node:TreeNode):if node is None:return# 左,先一直遍历到最左侧dfs(node.left)# 中,中间的处理逻辑,判断一个数是不是众数if self.pre :# 如果两个数相等,那出现的次数就递增if node.val==self.pre.val:self.times+=1else:self.times=1#  如果两个数不相等,并且遍历到一个数的数量超过了另一个数的数量if self.maxtimes< self.times:self.maxtimes=self.timesself.result.clear()self.result.append(self.pre.val)# 如果两个数的数量相等,那就把两个数都保存在result里,不需要清空elif self.maxtimes==self.times:self.result.append(node.val)self.pre=node# 右dfs(node.right)return self.result

最近公共祖先

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

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

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

在这里插入图片描述

示例 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,那该节点就是最近公共祖先,如果左子树或右子树其中一个没有出现p或q,那就往上返回,继续搜索。

class Solution:def lowestCommonAncestor(self, root, p, q):# 终止条件是如果根节点就包含if root == q or root == p or root is None:return rootleft = self.lowestCommonAncestor(root.left, p, q)right = self.lowestCommonAncestor(root.right, p, q)if left is not None and right is not None:return rootif left is None and right is not None:return rightelif left is not None and right is None:return leftelse: return None

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

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

相关文章

U盘打不开怎么办?专家解析原因与数据恢复之道

一、遭遇困境&#xff1a;U盘突然无法访问 在日常生活和工作中&#xff0c;U盘作为重要的数据存储和传输工具&#xff0c;其稳定性和可靠性至关重要。然而&#xff0c;有时我们会突然遭遇U盘打不开的困境&#xff0c;这无疑令人感到焦虑和困惑。当我们将U盘插入电脑时&#xf…

U盘文件夹变exe,数据恢复与防范全攻略

在日常使用U盘的过程中&#xff0c;不少用户都遭遇过这样一个令人头疼的问题&#xff1a;原本整齐有序的文件夹突然变成了exe可执行文件。这种异常情况不仅影响了文件的正常访问&#xff0c;更可能隐藏着数据丢失的风险。本文将深入探讨U盘文件夹变exe现象的背后原因&#xff0…

OSCP靶场--BlackGate

OSCP靶场–BlackGate 考点(1.redis rce 2. CVE-2021-4034提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.163.176 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-14 03:32 EDT Nmap scan report for 192.168.163.…

《LeetCode热题100》笔记题解思路技巧优化_Part_3

《LeetCode热题100》笔记&题解&思路&技巧&优化_Part_3 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题链表&#x1f7e2;1. 相交链表&#x1f7e2;2. 反转链表&…

Python常见设计模式库之python-patterns使用详解

概要 设计模式是解决软件设计问题的经验总结和最佳实践。Python 作为一种灵活且强大的编程语言,也可以使用设计模式来提高代码的可读性、可维护性和可扩展性。Python Patterns 库提供了一系列经典和常用的设计模式实现,本文将深入探讨 Python Patterns 库的功能、使用方法以…

java-app后台系统崩溃后的处理

系统架构&#xff1a; 系统用的是ngixn 、spirngcloud、nacos作为注册中心、gateway网管&#xff0c;数据库是mysql 数据库只有一个 服务也是单实例的 所以没有办法做负载均衡什么的。 问题描述&#xff1a; 公司近期开了几个活动之后由于访次数较多和代码问题导致系统挂了。…

Git如何清除账户凭证

场景&#xff1a;一般发生在Git用户变更的情况 1.git base 操作 Git会使用凭证助手 credential.helper来储存账户凭证&#xff0c;通过以下命令移除&#xff1a; git config --system --unset credential.helper 除了system系统级外&#xff0c;还有 global、local范围。 查…

【数据结构】二叉树---红黑树的实现

目录 一. 红黑树的概念及性质 二. 红黑树结点结构的定义 三. 红黑树的插入操作 1. 情况一 2. 情况二 3. 情况三 四. 红黑树的验证 五. 红黑树与AVL树的比较 一. 红黑树的概念及性质 红黑树是一种自平衡的二叉搜索树&#xff0c;它在每个节点上增加了一个存储位来表示…

并发编程之创建线程的几种方式以及运行的详细解析

3.1 创建和运行线程 方法一&#xff0c;直接使用 Thread // 创建线程对象 Thread t new Thread() {public void run() {// 要执行的任务} }; // 启动线程 t.start(); 例如&#xff1a; // 构造方法的参数是给线程指定名字&#xff0c;推荐 Thread t1 new Thread("t1…

mysql中用逗号隔开的某字段,如何判断其他表的字段值是否在这个字段中

因为要增加需求&#xff0c;需要将线上表中老数据&#xff0c;修改为新数据的规则。 线上两张表&#xff0c;sequence_number中is_use有3作废、2到期状态&#xff0c;需要根据这个状态和school_ai_authorization中的is_deleted修改新增的state字段。 sequence_number表结构&…

Mint_21.3 drawing-area和goocanvas的FB笔记(八)

FreeBASIC与TinyPTC绘图 TinyPTC是个操作非常简单的库&#xff0c;有各平台用的版本&#xff0c;linux平台版本又分为sdl版和gfx版&#xff0c;gfx版本比sdl版本速度快&#xff0c;尺寸不大&#xff0c;可操作的函数只有3个&#xff1a; ptc_open, ptc_update, ptc_close …

若依框架的使用

文章目录 0,项目介绍项目架构项目原型 1,前端2,后端3,数据库4,测试5,二开5.1 创建新module5.2 添加pom依赖5.3 添加测试代码5.4 测试5.5 跳过验证(后期要改回来)5.6 修改前端路由5.7 添加前端菜单5.7.1 一级菜单5.7.2 二级菜单5.7.3 测试 5.8 课程列表-后台5.8.0 项目结构5.8.1…