当前位置: 首页 > news >正文

python coding with ChatGPT 打卡第20天| 二叉搜索树:搜索、验证、最小绝对差、众数

相关推荐
python coding with ChatGPT 打卡第12天| 二叉树:理论基础
python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历
python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历
python coding with ChatGPT 打卡第15天| 二叉树:翻转二叉树、对称二叉树
python coding with ChatGPT 打卡第16天| 二叉树:完全二叉树、平衡二叉树、二叉树的所有路径、左叶子之和
python coding with ChatGPT 打卡第17天| 二叉树:找树左下角的值、路径总和
python coding with ChatGPT 打卡第18天| 二叉树:从中序与后序遍历序列构造二叉树、最大二叉树
python coding with ChatGPT 打卡第19天| 二叉树:合并二叉树

二叉搜索树中的搜索

Key Points

1.二叉搜索树是一个有序树:

- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树

2.二叉搜索树的迭代
一提到二叉树遍历的迭代法,可能立刻想起使用栈来模拟深度遍历,使用队列来模拟广度遍历。

对于二叉搜索树可就不一样了,因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列就可以写出迭代法

对于一般二叉树,递归过程中还有回溯的过程,例如走一个左方向的分支走到头了,那么要调头,在走右分支。

对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向

相关题目

700. 二叉搜索树中的搜索

视频讲解

这次搜索有方向了

重点分析

方法一:
递归法

def searchBST(root, val):if not root:return Noneif root.val > val:return searchBST(root.left, val)if root.val < val:return searchBST(root.right, val)return root

方法二:
迭代法

def searchBST(root, val):current = rootwhile current:if current.val > val:current = current.leftcontinueif current.val < val:current = current.rightcontinueelse:breakreturn current

验证二叉搜索树

Key Points

中序遍历下,输出的二叉搜索树节点的数值是升序序列。

相关题目

98. 验证二叉搜索树

视频讲解

你对二叉搜索树的了解还不够

重点分析

方法一:
不使用有序序列
在这里插入图片描述
我们可以定义一个辅助函数checkBST,它接收四个参数:当前节点node、minVal(当前节点值允许的最小值)、maxVal(当前节点值允许的最大值)、以及初始的根节点root。这个辅助函数将帮助我们递归地验证每个子树,同时保持跟踪允许的值的范围。

def checkBST(node, minVal, maxVal):if not node:return Trueif node.val <= minVal or node.val >= maxVal:return Falsereturn checkBST(node.left, minVal, node.val) and checkBST(node.right, node.val, maxVal)def isValidBST(root):return checkBST(root, float('-inf'), float('inf'))

这段代码使用了一个嵌套的辅助函数checkBST来递归地验证每个节点是否符合二叉搜索树的条件,它通过维护每个节点的值允许的最小值和最大值来实现。这种方法能够确保所有的左子树节点都小于它的父节点,并且所有的右子树节点都大于它的父节点,同时还考虑了所有祖先节点的约束条件。

方法二:
使用有序序列 + 双指针 递归法
在这里插入图片描述

class Solution:def __init__(self):self.pre = None  # 用来记录前一个节点def isValidBST(self, root):if root is None:return Trueleft = self.isValidBST(root.left)if self.pre is not None and self.pre.val >= root.val:return Falseself.pre = root  # 记录前一个节点right = self.isValidBST(root.right)return left and right

方法三:
使用有序序列 + 双指针 迭代法

在这里插入图片描述

def isValidBST(root):stack = []prev = Nonewhile stack or root:# 遍历到最左while root:stack.append(root)root = root.left# 访问节点root = stack.pop()# 检查当前节点是否大于前一个节点if prev and root.val <= prev.val:return Falseprev = root# 转向右子树root = root.rightreturn True

二叉搜索树的最小绝对差

Key Points

  1. 在升序数组中,任意两个相邻元素的差值最小
  2. 1)暴力法:先中序遍历得到升序数列,再遍历数组求最小差值;
    2)简化法:遍历的过程中使用双指针

相关题目

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

视频讲解

二叉搜索树中的双指针遍历

重点分析

方法一:
递归法

class Solution(object):def __init__(self):self.pre = None   self.diff = float('inf')  # 只使用一次,所以是全局变量def getMinimumDifference(self, root):self.in_traversal(root)return self.diffdef in_traversal(self, root):if not root:returnself.in_traversal(root.left)if self.pre:self.diff = min(root.val - self.pre.val, self.diff)self.pre = rootself.in_traversal(root.right)return

方法二:
迭代法 + 暴力

def getMinimumDifference(root):stack_record = []current = rootres = []while stack_record or current:while current:stack_record.append(current)current = current.leftcurrent = stack_record.pop()res.append(current.val)# 左中都处理完了,转向右current = current.righti = 0j = i+1diff = res[j] - res[i]while j < len(res):diff = min(res[j] - res[i], diff)i += 1j += 1return diff

注:LeetCode题目中说明节点至少为两个,所以使用双指针不用讨论数组长度

方法三:
迭代法+简化

def getMinimumDifference(root):stack_record = []current = rootdiff = float('inf')pre = Nonewhile stack_record or current:while current:stack_record.append(current)current = current.leftcurrent = stack_record.pop()if pre is None:   # if not pre 不行,警惕0的情况pre = current.valelse:diff = min(current.val-pre, diff)pre = current.valcurrent = current.rightreturn diff

二叉搜索树中的众数

Key Points

首先如果不是二叉搜索树的话,应该怎么解题,是二叉搜索树,又应该如何解题,两种方式做一个比较,可以加深大家对二叉树的理解。

  1. 如果不是二叉搜索树,最直观的方法一定是把这个树都遍历了,用map统计频率,把频率排个序,最后取前面高频的元素的集合。
  2. 对于二叉搜索树,遍历有序数组的元素出现频率,从头遍历,那么一定是相邻两个元素作比较,然后就把出现频率最高的元素输出就可以了。

相关题目

501. 二叉搜索树中的众数

视频讲解

双指针+代码技巧

重点分析

方法一:
暴力法 哈希表(迭代)

def findMode(root):res = []stack_record = []current = rootwhile stack_record or current:while current:stack_record.append(current)current = current.leftcurrent = stack_record.pop()res.append(current.val)current = current.rightrecord = {}for x in res:record[x] = record.get(x, 0) + 1record_sort = sorted(record.items(), key=lambda x:x[1], reverse=True)results = []max_val = record_sort[0][1]for x in record_sort:if x[1] == max_val:results.append(x[0])else:breakreturn results

方法二:
遍历两遍 双指针 (迭代法)

def findMode(root):res = []stack_record = []current = rootwhile stack_record or current:while current:stack_record.append(current)current = current.leftcurrent = stack_record.pop()res.append(current.val)current = current.rightpre = Nonecount = 0max_count = 0results = []for x in res:if pre is not None:if pre == x:count +=1else:count = 1else:count = 1pre = xif count == max_count:results.append(x)elif count > max_count:max_count = countresults = [x]return results

方法三:
遍历一遍 迭代法

def findMode(root):res = []pre = Nonemax_count = 0count = 0stack_record = []current = rootwhile stack_record or current:while current:stack_record.append(current)current = current.leftcurrent = stack_record.pop()if pre:if current.val == pre.val:count += 1else:count = 1else:count = 1pre = currentif count == max_count:res.append(current.val)elif count > max_count:max_count = countres = [current.val]current = current.rightreturn res

方法四:
遍历一遍 递归法

class Solution:def __init__(self):self.pre = Noneself.res = []self.max_count = 0self.count = 0def in_traversal(self, root):if not root:returnself.in_traversal(root.left)if self.pre:if root.val == self.pre.val:self.count += 1else:self.count = 1else:self.count = 1self.pre = rootif self.count == self.max_count:self.res.append(root.val)elif self.count > self.max_count:self.max_count = self.countself.res = [root.val]self.in_traversal(root.right)returndef findMode(self, root):self.in_traversal(root)return self.res

相关文章:

python coding with ChatGPT 打卡第20天| 二叉搜索树:搜索、验证、最小绝对差、众数

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树&#xff1a;理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树&#xff1a;翻转…...

Stable Diffusion——基础模型、VAE、LORA、Embedding各个模型的介绍与使用方法

前言 Stable Diffusion&#xff08;稳定扩散&#xff09;是一种生成模型&#xff0c;基于扩散过程来生成高质量的图像。它通过一个渐进过程&#xff0c;从一个简单的噪声开始&#xff0c;逐步转变成目标图像&#xff0c;生成高保真度的图像。这个模型的基础版本是基于扩散过程…...

Python自动化部署与配置管理:Ansible与Docker

Ansible 和 Docker 是两种常用于自动化部署和配置管理的工具。Ansible 是一个基于 Python 的自动化运维工具&#xff0c;可以配置管理、应用部署、任务自动化等。而 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&…...

《摔跤吧爸爸》19岁女星突患皮肌炎离世

从确诊到离世仅10天……罕见病“皮肌炎”&#xff01; 曾凭借在知名电影《摔跤吧&#xff01;爸爸》中饰演童年时期“小芭比塔”一角而广受喜爱的年轻演员苏哈尼巴特纳格尔不幸离世&#xff0c;年仅19岁。她的突然逝世引发了全球关注&#xff0c;据苏哈妮的家人表示&#xff0…...

用结构体数组,完成宠物信息登记管理。

管理宠物的名字&#xff0c;品种&#xff0c;年龄。 实现功能如下: 1.插入宠物信息 2.遍历宠物信息 #include <stdio.h> #define N 100 typedef struct chongwu { char name[20]; char pingz[10]; int age; }cw; void intset_cw(cw *ptr,int *pnum) { printf("请…...

频率主义线性回归和贝叶斯线性回归

整体概述 频率主义&#xff08;Frequentist&#xff09;线性回归和贝叶斯&#xff08;Bayesian&#xff09;线性回归是统计学中用于数据分析和预测的两种主要方法&#xff0c;特别是在建模关于因变量和自变量之间线性关系的上下文中。尽管两种方法都用于线性回归分析&#xff…...

【感知算法】Dempster-Shafer理论(下)

尝试DS理论应用到自动驾驶地图众包更新。 地图特征变化判断 a mass function is applied to quantify the evidence of the existence. existence state: existenct、non-existent、tenative、conflict ∃ ∄ Ω ϕ \exist \\ \not\exist \\ \Omega \\ \phi ∃∃Ωϕ ma…...

通过conda安装cudatoolikit和cudnn

通过conda安装cudatoolikit和cudnn 安装cudatoolkit安装cudnn安装cudatoolkit-dev 安装cudatoolkit conda install cudatoolkit11.3 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 安装cudnn conda install cudnn8.5 -c https://mirrors.tuna.tsinghua.edu.…...

vue中使用jsx语法

请注意&#xff0c;在 Vue 中使用 JSX 时&#xff0c;你仍然需要通过 h 函数&#xff08;通常是一个别名&#xff0c;对应于 createElement 函数&#xff09;来创建虚拟 DOM 元素。在下面的例子中&#xff0c;h 函数作为 render 函数的参数传入&#xff0c;但在 JSX 语法中你通…...

我的NPI项目之Android USB 系列(一) - 遥望和USB的相识

和USB应该是老朋友了&#xff0c;从2011年接触Android开发开始&#xff0c;就天天和USB打交道了。那时候还有不 对称扁头的usb/方口的usb&#xff0c;直到如今使用广泛的防反插USB3.0 type-C。 但是&#xff0c;一直有一个不是很清楚的问题萦绕在心头&#xff0c;那就是。先有…...

K8s进阶之路-命名空间级-服务发现 :

服务发现&#xff1a; Service&#xff08;东西流量&#xff09;&#xff1a;集群内网络通信、负载均衡&#xff08;四层负载&#xff09;内部跨节点&#xff0c;节点与节点之间的通信&#xff0c;以及pod与pod之间的通信&#xff0c;用Service暴露端口即可实现 Ingress&#…...

智慧公厕管理系统:让城市智慧驿站更加智慧舒适

智慧公厕管理系统是城市智慧驿站中不可或缺的一部分&#xff0c;它通过全方位的信息化解决方案&#xff0c;为公共厕所的使用、运营和管理提供了一种智能化的方式。作为城市智慧驿站的重要组成部分&#xff0c;智慧公厕管理系统发挥着重要的作用&#xff0c;为城市社会民生提供…...

图形渲染基础学习

原文链接&#xff1a;游戏开发入门&#xff08;三&#xff09;图形渲染_如果一个面只有三个像素进行渲染可以理解为是定点渲染吗?-CSDN博客 游戏开发入门&#xff08;三&#xff09;图形渲染笔记&#xff1a; 渲染一般分为离线渲染与实时渲染&#xff0c;游戏中我们用的都是…...

每日学习总结20240219

每日总结 20240219 1.文件类型.csv CSV文件是一种以逗号分隔值&#xff08;Comma-Separated Values&#xff09;为标记的文本文件&#xff0c;它可以用来存储表格数据。每一行表示一条记录&#xff0c;而每一条记录中的字段则使用逗号或其他特定的分隔符进行分隔。 常用场景…...

K8s进阶之路-安装部署K8s

参考&#xff1a;&#xff08;部署过程参考的下面红色字体文档链接就可以&#xff0c;步骤很详细&#xff0c;重点部分在下面做了标注&#xff09; 安装部署K8S集群文档&#xff1a; 使用kubeadm方式搭建K8S集群 GitBook 本机&#xff1a; master&#xff1a;10.0.0.13 maste…...

springboot集成elk实现日志采集可视化

一、安装ELK 安装ELK组件请参考我这篇博客&#xff1a;windows下安装ELK(踩坑记录)_windows上安装elk教程-CSDN博客 这里不再重复赘述。 二、编写logstash配置 ELK组件均安装好并成功启动&#xff0c;进入到logstash组件下的config文件夹&#xff0c;创建logstash.conf配置…...

leetcode 148. 排序链表 java解法

Problem: 148. 排序链表 思路 这是一个链表排序的问题&#xff0c;由于要求时间复杂度为 O(nlogn)&#xff0c;适合使用归并排序&#xff08;Merge Sort&#xff09;来解决。 解题方法 首先&#xff0c;使用快慢指针找到链表的中间节点&#xff0c;将链表分成两部分。然后&…...

【MATLAB源码-第140期】基于matlab的深度学习的两用户NOMA-OFDM系统信道估计仿真,对比LS,MMSE,ML。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 深度学习技术在无线通信领域的应用越来越广泛&#xff0c;特别是在非正交多址接入&#xff08;NOMA&#xff09;和正交频分复用&#xff08;OFDM&#xff09;系统中&#xff0c;深度学习技术被用来提高信道估计的性能和效率。…...

运动重定向学习笔记

目录 深度学习 重定向 2020年的模型: 重定向之后的bvh: 深度学习 重定向 输入是bvh,输出也是bvh...

导出Excel,支持最佳

列表信息导出为Excel文件&#xff0c; 依赖pom&#xff1a; Sheet, Row:<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId> </dependency>XSSFWorkbook <dependency><groupId>org.apache.poi</…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...

【题解-洛谷】P10480 可达性统计

题目&#xff1a;P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图&#xff0c;分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M&#xff0c;接下来 M M M 行每行两个整数 x , y x,y x,y&#xff0c;表示从 …...