代码随想录第15天:(二叉树)

一、二叉搜索树的最小绝对差(Leetcode 530)

思路1 :中序遍历将二叉树转化为有序数组,然后暴力求解。

class Solution:def __init__(self):# 初始化一个空的列表,用于保存树的节点值self.vec = []def traversal(self, root):# 递归函数进行中序遍历,填充self.vec列表if root is None:return  # 如果当前节点为空,直接返回# 先递归遍历左子树self.traversal(root.left)# 将当前节点的值添加到vec列表中self.vec.append(root.val)# 然后递归遍历右子树self.traversal(root.right)def getMinimumDifference(self, root):# 清空self.vec,确保每次调用时都能重新计算最小差值self.vec = []# 中序遍历树,将节点值按升序存入self.vecself.traversal(root)# 如果树中少于两个节点,则没有有效的差值可计算,返回0if len(self.vec) < 2:return 0# 初始化最小差值为正无穷大,用于后续的最小差值比较result = float('inf')# 遍历self.vec,计算相邻节点值之间的差值for i in range(1, len(self.vec)):# 计算相邻节点之间的差值,并更新最小差值result = min(result, self.vec[i] - self.vec[i - 1])# 返回最小差值return result

思路2:双指针直接操作二叉树,求任意不同节点值的最小差。

class Solution:def __init__(self):# 初始化最小差值为正无穷,表示尚未计算差值self.result = float('inf')# 初始化pre为None,用来记录上一个访问的节点self.pre = Nonedef traversal(self, cur):# 如果当前节点为空,直接返回if cur is None:return# 递归遍历左子树self.traversal(cur.left)# 计算当前节点与上一个节点的差值if self.pre is not None:  # 如果pre不为空,说明当前节点不是最左边的节点# 更新最小差值,计算当前节点与前一个节点的差值,并更新result为更小的值self.result = min(self.result, cur.val - self.pre.val)# 记录当前节点,作为下一个节点的前一个节点self.pre = cur# 递归遍历右子树self.traversal(cur.right)def getMinimumDifference(self, root):# 调用traversal进行中序遍历self.traversal(root)# 返回计算得到的最小差值return self.result

二、二叉搜索树中的众数(Leetcode 501)

思路1:利用字典

from collections import defaultdict# 定义二叉树节点类 TreeNode
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = rightclass Solution:# 在BST中搜索并统计每个节点的值的频率def searchBST(self, cur, freq_map):if cur is None:return# 统计当前节点值的频率freq_map[cur.val] += 1# 递归遍历左子树self.searchBST(cur.left, freq_map)# 递归遍历右子树self.searchBST(cur.right, freq_map)# 找出二叉搜索树中的出现频率最高的值def findMode(self, root):# 初始化一个字典来记录每个元素的频率,使用defaultdict方便处理未出现的键freq_map = defaultdict(int)result = []# 如果根节点为空,返回空列表if root is None:return result# 调用递归方法遍历二叉树并统计频率self.searchBST(root, freq_map)# 获取频率的最大值max_freq = max(freq_map.values())# 找出所有出现频率等于最大值的元素for key, freq in freq_map.items():if freq == max_freq:result.append(key)# 返回频率最高的值return result

思路二:利用二叉树性质

class Solution:def __init__(self):self.maxCount = 0  # 最大频率self.count = 0  # 当前频率self.pre = None  # 前一个节点self.result = []  # 存储众数# 用中序遍历BST,并统计节点值的频率def searchBST(self, cur):if cur is None:return# 递归遍历左子树self.searchBST(cur.left)  # 左# 中if self.pre is None:  # 第一个节点,初始化频率为1self.count = 1elif self.pre.val == cur.val:  # 当前节点与前一个节点值相同,增加频率self.count += 1else:  # 当前节点与前一个节点值不同,重新计数为1self.count = 1# 更新前一个节点为当前节点self.pre = cur  # 更新前一个节点# 如果当前节点的频率等于最大频率,将该节点值添加到结果列表if self.count == self.maxCount:  self.result.append(cur.val)# 如果当前节点的频率大于最大频率,更新最大频率,并清空结果列表,将当前节点值加入if self.count > self.maxCount:  self.maxCount = self.count  # 更新最大频率self.result = [cur.val]  # 清空结果列表并将当前节点值加入# 递归遍历右子树self.searchBST(cur.right)  # 右returndef findMode(self, root):self.count = 0  # 重置频率self.maxCount = 0  # 重置最大频率self.pre = None  # 重置前一个节点self.result = []  # 清空结果列表self.searchBST(root)  # 调用searchBST进行遍历并统计return self.result  # 返回众数

三、二叉树的最近公共祖先(Leetcode 236)

class Solution:# 定义一个函数来寻找最近公共祖先def lowestCommonAncestor(self, root, p, q):# 基本的终止条件# 1. 如果当前节点是 p 或 q,返回当前节点。# 2. 如果当前节点是 None,说明这条路径不包含 p 或 q,返回 None。if root == q or root == p or root is None:return root# 递归遍历左子树,找到 p 和 q 中其中一个的最近公共祖先left = self.lowestCommonAncestor(root.left, p, q)# 递归遍历右子树,找到 p 和 q 中其中一个的最近公共祖先right = self.lowestCommonAncestor(root.right, p, q)# 如果左子树和右子树分别都找到了 p 或 q,说明当前节点是最近公共祖先# 因为 p 和 q 分别位于左右子树if left is not None and right is not None:return root# 如果左子树找到了 p 或 q,右子树为 None,说明公共祖先在左子树if left is None and right is not None:return right# 如果右子树找到了 p 或 q,左子树为 None,说明公共祖先在右子树elif left is not None and right is None:return left# 如果左右子树都为 None,说明当前节点不是公共祖先,返回 Noneelse:return None

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

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

相关文章

计算机操作系统-【死锁】

文章目录 一、什么是死锁&#xff1f;死锁产生的原因&#xff1f;死锁产生的必要条件&#xff1f;互斥条件请求并保持不可剥夺环路等待 二、处理死锁的基本方法死锁的预防摒弃请求和保持条件摒弃不可剥夺条件摒弃环路等待条件 死锁的避免银行家算法案例 提示&#xff1a;以下是…

vue拓扑图组件

vue拓扑图组件 介绍技术栈功能特性快速开始安装依赖开发调试构建部署 使用示例演示截图组件源码 介绍 一个基于 Vue3 的拓扑图组件&#xff0c;具有以下特点&#xff1a; 1.基于 vue-flow 实现&#xff0c;提供流畅的拓扑图展示体验 2.支持传入 JSON 对象自动生成拓扑结构 3.自…

go 通过汇编分析函数传参与返回值机制

文章目录 概要一、前置知识二、汇编分析2.1、示例2.2、汇编2.2.1、 寄存器传值的汇编2.2.2、 栈内存传值的汇编 三、拓展3.1 了解go中的Duff’s Device3.2 go tool compile3.2 call 0x46dc70 & call 0x46dfda 概要 在上一篇文章中&#xff0c;我们研究了go函数调用时的栈布…

python-1. 找单独的数

问题描述 在一个班级中&#xff0c;每位同学都拿到了一张卡片&#xff0c;上面有一个整数。有趣的是&#xff0c;除了一个数字之外&#xff0c;所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。 要求&#xff1a; 设…

算法学习C++需注意的基本知识

文章目录 01_算法中C需注意的基本知识cmath头文件一些计算符ASCII码表数据类型长度运算符cout固定输出格式浮点数的比较max排序自定义类型字符的大小写转换与判断判断字符是数字还是字母 02_数据结构需要注意的内容1.stringgetline函数的使用string::findsubstr截取字符串strin…

从零开始写android 的智能指针

Android中定义了两种智能指针类型&#xff0c;一种是强指针sp&#xff08;strong pointer&#xff09;&#xff0c;源码中的位置在system/core/include/utils/StrongPointer.h。另外一种是弱指针&#xff08;weak pointer&#xff09;。其实称之为强引用和弱引用更合适一些。强…

【leetcode hot 100 152】乘积最大子数组

错误解法&#xff1a;db[i]表示以i结尾的最大的非空连续&#xff0c;动态规划&#xff1a;dp[i] Math.max(nums[i], nums[i] * dp[i - 1]); class Solution {public int maxProduct(int[] nums) {int n nums.length;int[] dp new int[n]; // db[i]表示以i结尾的最大的非空连…

图论整理复习

回溯&#xff1a; 模板&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&#xff…

uniapp离线打包提示未添加videoplayer模块

uniapp中使用到video标签&#xff0c;但是离线打包放到安卓工程中&#xff0c;运行到真机中时提示如下&#xff1a; 解决方案&#xff1a; 1、把media-release.aar、weex_videoplayer-release.aar放到工程的libs目录下; 文档&#xff1a;https://nativesupport.dcloud.net.cn/…

打包构建替换App名称

方案适用背景 一套代码出多个安装包&#xff0c;且安装包的应用名称、图标都不一样考虑三语名称问题 通过 Gradle 脚本实现 gradle.properties 里面定义标识来区分应用&#xff0c;如下文里的 APP_TYPEAAA 、APP_TYPEBBB// 定义 groovy 替换方法 def replaceAppName(String …

DrissionPage移动端自动化:从H5到原生App的跨界测试

一、移动端自动化测试的挑战与机遇 移动端测试面临多维度挑战&#xff1a; 设备碎片化&#xff1a;Android/iOS版本、屏幕分辨率差异 混合应用架构&#xff1a;H5页面与原生组件的深度耦合 交互复杂性&#xff1a;多点触控、手势操作、传感器模拟 性能监控&#xff1a;内存…

达梦数据库用函数实现身份证合法校验

达梦数据库用函数实现身份证合法校验 拿走不谢~ CREATE OR REPLACE FUNCTION CHECK_IDCARD(A_SFZ IN VARCHAR2) RETURN VARCHAR2 IS TYPE WEIGHT_TAB IS VARRAY(17) OF NUMBER; TYPE CHECK_TAB IS VARRAY(11) OF CHAR; WEIGHT_FACTOR WEIGHT_TAB : WEIGHT_TAB(7,9,10,5,8,4,…

3dmax的python通过普通的摄像头动捕表情

1、安装python 进入cdm&#xff0c;打python要能显示版本号 >>>&#xff08;进入python提示符模式&#xff09; import sys sys.path显示python的安装路径&#xff0c; 进入到python.exe的路径 在python目录中安装(ctrlz退出python交互模式) 2、pip install mediapipe…

国产Linux统信安装mysql8教程步骤

系统环境 uname -a Linux FlencherHU-PC 6.12.9-amd64-desktop-rolling #23.01.01.18 SMP PREEMPT_DYNAMIC Fri Jan 10 18:29:31 CST 2025 x86_64 GNU/Linux下载离线安装包 浏览器下载https://downloads.mysql.com/archives/get/p/23/file/mysql-test-8.0.33-linux-glibc2.28…

Vite 权限绕过导致任意文件读取(CVE-2025-32395)(附脚本)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 前言…

poi-tl

官网地址 Poi-tl Documentationword模板引擎https://deepoove.com/poi-tl github 地址 https://github.com/Sayi/poi-tl/tree/master gitcode 加速地址 GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码…

操作系统 4.1-I/O与显示器

外设工作起来 操作系统让外设工作的基本原理和过程&#xff0c;具体来说&#xff0c;它概括了以下几个关键步骤&#xff1a; 发出指令&#xff1a;操作系统通过向控制器中的寄存器发送指令来启动外设的工作。这些指令通常是通过I/O指令&#xff08;如out指令&#xff09;来实现…

琥珀扫描 2.0.5.0 | 文档处理全能助手,支持扫描、文字提取及表格识别

琥珀扫描是一款功能强大的文档处理应用程序。它不仅仅支持基本的文档扫描功能&#xff0c;还涵盖了文字提取、证件扫描、表格识别等多种实用功能。无论是学生、职员还是教师&#xff0c;都能从中找到适合自己的功能。该应用支持拍照生成电子件&#xff0c;并能自动矫正文档边缘…

jQuery UI 小部件方法调用详解

jQuery UI 小部件方法调用详解 引言 jQuery UI 是一个基于 jQuery 的用户界面和交互库,它提供了一系列小部件,如按钮、对话框、进度条等,这些小部件极大地丰富了网页的交互性和用户体验。本文将详细介绍 jQuery UI 中小部件的方法调用,帮助开发者更好地理解和应用这些小部…

浮点数比较在Eigen数学库中的处理方法

浮点数比较在Eigen数学库中的处理方法 在Eigen数学库中进行浮点数比较时&#xff0c;由于浮点数的精度问题&#xff0c;直接使用运算符通常不是推荐的做法。Eigen提供了几种更安全的方法来进行浮点数比较&#xff1a; 1. 近似相等比较 使用isApprox()函数进行近似比较&#…