算法通关村第九关 | 二叉树查找和搜索树原理
1. 二分查找的扩展问题
1.1山脉数组的巅峰索引
LeetCode852:题目核心意思是在数组中,从0到i是递增的,从i+1到数组最后是递减的,让你找到这个最高点。
三种情况:
-
mid在上升阶段的时候,满足arr[mid] > arr[mid - 1] && arr[mid] < arr[mid + 1];
-
mid在顶峰的时候,满足arr[mid] > arr[mid - 1] && arr[mid] > arr[mid + 1];
-
mid在下降阶段,满足arr[mid] < arr[mid - 1] && arr[mid] > arr[mid + 1];
根据三种情况我们可以写出二分查找的代码:
//山脉数组最高山峰问题public static int peakindex(int[] arr) {//长度为3的时候最高点索引是1if (arr.length == 3) {return 1;}int left = 0;int right = arr.length - 2;//减2,否则下面会越界//需要注意是否是等号问题,当=的时候是峰顶,不需要再进行处理,while (left < right) {int mid = left + ((right - left) >> 1);if (arr[mid] < arr[mid - 1] && arr[mid] > arr[mid + 1]) {return mid;} else if (arr[mid] > arr[mid - 1] && arr[mid] < arr[mid + 1]) {left = mid + 1;} else if (arr[mid] < arr[mid - 1] && arr[mid] > arr[mid + 1]) {right = mid - 1;}}return left;}
1.2 旋转数字的最小数字
LeetCode153,已知一个长度为n的数组,预先按照升序排列,经由1-n次旋转后,得到输入数组。例如原数组nums = [0,1,2,4,5,6,7]在变化后可能得到:
-
若旋转4次,则可以得到[4,5,6,7,0,1,2];
-
若旋转7次,则可以得到[0,1,2,4,5,6,7];
我们可以考虑数组的最后一个元素x,在最小值右侧的元素(不包括最后一个元素本身),它们的值一定都严格小于x,而在最小值左侧的元素,它们的值一定都严格大于x,因此,我们可以根据这一条性质,通过二分查找方法找出最小值。
-
第一种情况nums[pivot] < nums[high] ,这说明nums[pivot]是最小值右侧的元素,因此我们可以忽略右半部分,
-
第二种情况nums[pivot] > nums[high],这说明nums是最小值左侧元素,因此我们可以忽略二分查找的左半部分
-
由于数组中不包含重复元素,并且只要当前区间长度不为1,pivot就不会和high重合;而如果当前的区间长度为1.这说明我们已经可以结束二分查找了。因此不会存在nums[pivot] = nums[high]的情况。
-
当二分查找结束时,我们就找到最小值所在的位置。

图1,第一种情况

图2,第二种情况
//旋转数字的最小数字public int findMin(int[] arr) {int low = 0;int high = arr.length - 1;//low=high的时候停止while (low < high){int pivot = low + ((high - low) >> 1);if (arr[pivot] < arr[high]){high = pivot;}else {low = pivot + 1;}}return arr[low];}
2.中序与搜索树原理
二叉搜索树概念:
若它的左子树不为空,则左子树上的所有节点的值均小于它根节点的值;
若它的右子树不为空,则右子树上所有节点的值均大于它的根节点的值;
它的左右子树也分别为二叉树。下面给出两个例子

注意事项:
是左子树或右子树所有节点大于或小于根节点,不是左结点或右节点,注意是所有。
2.1 二叉搜索树中搜索特定的值
LeetCode700:给定的二叉搜索树的根节点和一个值,你需要在BST中找到节点值等于给定值的节点,返回该节点的子树,若节点不存在,则返回null;
类似于二分查找的方式,递归:
2.2 验证二叉搜索树
LeetCode98.给你一个二叉树的根节点root,判断是否是一个有效的二叉搜索树,
根据前面的定义来递归判断:
//这句话在方法外面只创建一次int pre = Integer.MIN_VALUE;public boolean isBST(TreeNode root){if (root == null){return true;}if (!isBST(root.left)){return false;}//访问当前节点,如果当前节点小于等于中序遍历的前一个结点,说明不满足BSTif (root.val <= pre){return false;}pre = root.val;//右子第一个左或中节点与根节点比较return isBST(root.right);}
-
如果根节点root == null或者根节点的搜索值val == root.val,返回根节点
-
如果val < root.val,进入根节点的左子树查找searchBST(root.left);
-
如果val > root.val,进入根节点的右子树查找searchBST(root.right)
-
public TreeNode searchBST(TreeNode root,int val){if (root == null || val == root.val) return root;return val < root.val?searchBST(root.left,val):searchBST(root.right,val);} -
如果根节点root == null或者根节点的搜索值val == root.val,返回根节点
-
如果val < root.val,进入根节点的左子树查找searchBST(root.left);
-
如果val > root.val,进入根节点的右子树查找searchBST(root.right)
相关文章:
算法通关村第九关 | 二叉树查找和搜索树原理
1. 二分查找的扩展问题 1.1山脉数组的巅峰索引 LeetCode852:题目核心意思是在数组中,从0到i是递增的,从i1到数组最后是递减的,让你找到这个最高点。 三种情况: mid在上升阶段的时候,满足arr[mid] > a…...
jenkins gitlab 安装
目录 一 准备安装环境 二 安装gitlab软件 三 配置gitlab 四 重新加载配置启动gitlab 五 修改密码 五 创建用户组 一 准备安装环境 sudo yum update sudo yum install -y curl policycoreutils-python openssh-server安装 Postfix 邮件服务器,以便 Git…...
Vue2(组件开发)
目录 前言一,组件的使用二,插槽slot三,refs和parent四,父子组件间的通信4.1,父传子 :父传子的时候,通过属性传递4.2,父组件监听自定义事件 五,非父子组件的通信六&#x…...
(二)结构型模式:8、代理模式(Proxy Pattern)(C++示例)
目录 1、代理模式(Proxy Pattern)含义 2、代理模式的UML图学习 3、代理模式的应用场景 4、代理模式的优缺点 5、C实现代理模式的实例 1、代理模式(Proxy Pattern)含义 代理模式(Proxy),为…...
代码审计-ASP.NET项目-未授权访问漏洞
代码审计必备知识点: 1、代码审计开始前准备: 环境搭建使用,工具插件安装使用,掌握各种漏洞原理及利用,代码开发类知识点。 2、代码审计前信息收集: 审计目标的程序名,版本,当前环境(系统,中间件…...
爬虫逆向实战(十四)--某培训平台登录
一、数据接口分析 主页地址:某培训平台 1、抓包 通过抓包可以发现登录是表单提交到j_spring_security_check 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以发现有一个j_password加密参数 请求头是否加密? 无响应是…...
GT Code - 图译算法编辑器(集成QT、C++、C、Linux、Git、java、web、go、高并发、服务器、分布式、网络编程、云计算、大数据项目)
目录 项目概述 发文意义 项目介绍 功能分析 设计概要 功能展示 项目文档 项目概述 “GT Code 图译算法编辑器”是一款跨平台、轻量级的代码编辑器,主要面向软件开发人员,它实现了编辑、编译、绘制代码流程图、生成调试演示动画等功能,以…...
# 快速评估立功科技基于S32K324的TMS方案
文章目录 1.前言2.立功科技的TMS方案介绍2.1 介绍资料2.2 简要介绍 3.S32K3_TriMotor评估板测试3.1 环境搭建S32 Design Studio for S32 Platform 3.4安装RTD 2.0.0安装Freemaster 3.2 3.2 例程测试3.3 例程适配3.4 双核烧录3.5 测试 1.前言 最近和一些做汽车水泵/风机的客户交…...
docker+haror
docker 2013年诞生,推荐单容器只运行一个程序或进程,形成一个分布式的应用模型。 总结下来就是:docker带来启动流程更快,运行效率较高、资源损耗较小,属于轻量级的服务。 docker的安装 推荐的一键化安装的脚本&#…...
Shell编程——弱数据类型的脚本语言快速入门指南
目录 Linux Shell 数据类型 变量类型 运算符 算术运算符 赋值运算符 拼接运算符 比较运算符 关系运算符 控制结构 顺序结构 条件分支结构 if 条件语句 case 分支语句 循环结构 for 循环 while 循环 until 循环 break 语句 continue语句 函数 函数定义 …...
iOS textView支持超链接跳转
将某些文字变成高量可以点击的超链接核心功能代码 attri.addAttribute(NSAttributedString.Key.link, value:NSURL.init(string: "dctt:p/userPrivacy.html")!, range: NSRange.init(location: s.count - 4, length: 4) )textView.linkTextAttributes [NSAttributed…...
大牛分析相机镜头光学中疑难问题
1、变焦和对焦有什么区别? 变焦就是改变镜头的焦距(准确说是像距),以改变拍摄的视角,也就是通常所说的把被摄体拉近或推远。例如18-55mm和70-200mm镜头就是典型的变焦镜头。焦距越长,视角越窄。 对焦通常指调整镜片组和底片(传感器平面)之间的距离,从而使被摄物在CC…...
xacro机器人模型文件转urdf文件怎么编写launch文件启动gazebo仿真和在rviz2内显示模型
urdf文件很直白,每个零件的</link> </joint>都要编写一遍,每个零件数据都要自己算出来结果,很麻烦,但是用起来很简单。xacro写的模型文件可以把好多常量提前定义出来,不同大小的机器人只要只要改一下常量…...
前端图片转base64,并使用canvas对图片进行压缩
目录 1.图片转base64的应用场景 2.图片转base64代码 3.对上传的图片进行压缩 1.图片转base64的应用场景 图片转base64通常用在用户上传图片的情况下使用,他的作用就是让用户看到预览的图片不受网络的影响。 这是传统的文件传输的流程:首先是用户选择…...
电脑键盘打不了字按哪个键恢复?最新分享!
“有没有朋友知道电脑键盘为什么会莫名其妙就打不了字?明明用得好好的,突然就打不了字了,真的让人很迷惑!有什么方法可以解决吗?” 电脑键盘为我们的办公提供了很大的方便,我们可以利用键盘输入我们需要的文…...
ue5读取外部文件
准备环境 我的环境是win10,ue5.1.1,cpux86。 创建工程时,需要选择C模式 这样在Content Browser中会出现C Classes文件夹,下面有一个本项目命名的文件夹,鼠标右键可以看到New C Class选项。 新建类的时候选择父类Blue…...
【ARM】Day4 点亮LED灯
1. 思维导图 2. 自己编写代码实现三盏灯点亮 .text .global _start _start: /**********LED1,LED2,LED3点灯:PE10,PF10,PE8**************/ RCC_INIT:使能GPIOE组/GPIOF组控制器,通过RXCC_MP_AHB4ENSETR设置第[5:4]位写1,地址:0x50000A28[5:4]1ldr r0,0x50000A28 …...
TiDB基础介绍、应用场景及架构
1. 什么是newsql NewSQL 是对各种新的可扩展/高性能数据库的简称,这类数据库不仅具有NoSQL对海量数据的存储管理能力,还保持了传统数据库支持ACID和SQL等特性。 NewSQL是指这样一类新式的关系型数据库管理系统,针对OLTP(读-写&…...
深入学习前端开发,掌握HTML、CSS、JavaScript等技术
课程链接: 链接: https://pan.baidu.com/s/1WECwJ4T8UQfs2FyjUMbxig?pwdi654 提取码: i654 复制这段内容后打开百度网盘手机App,操作更方便哦 --来自百度网盘超级会员v4的分享 课程介绍: 第1周:HTML5基础语法与标签 …...
python编程小游戏 五子棋,python编程小游戏简单的
大家好,本文将围绕python编程小游戏如何停止展开说明,python编程小游戏日语教程是一个很多人都想弄明白的事情,想搞清楚python编程小游戏超级玛丽需要先了解以下几个事情。 今天分享一个有趣的Python游戏库freegames,它里面包含经…...
手把手教你用Vivado配置Xilinx SEM IP 3.1:从IP Catalog到Tera Term串口调试全流程
手把手教你用Vivado配置Xilinx SEM IP 3.1:从IP Catalog到Tera Term串口调试全流程 在FPGA开发中,软错误缓解(SEM)IP核是确保设计可靠性的关键组件。对于使用Xilinx Artix-7系列芯片的工程师来说,掌握SEM IP的完整配置…...
SAP SD新手避坑指南:交货工厂和装运点配置错了,小心订单发不出去!
SAP SD配置实战:交货工厂与装运点配置错误的深度排查手册 当销售订单在SAP系统中卡在发货环节时,背后往往隐藏着交货工厂(Plant)与装运点(Shipping Point)的配置逻辑问题。这类错误不仅会导致业务流程中断&…...
Keil MDK-ARM许可证错误-25的解决方案
1. 问题现象与背景解析最近在升级Keil MDK-ARM到新版本后,不少开发者遇到了一个棘手的许可证错误。当尝试编译项目时,系统会弹出如下错误提示:Error: A9555E: License checkout for feature mdk_xxx_compiler5 with version 5.0201411 has be…...
谷歌DeepMind让AI学会“主动查资料“
这项由爱丁堡大学与谷歌DeepMind联合开展的研究,以预印本形式发布于2026年5月13日,论文编号为arXiv:2605.13050v1,有兴趣深入了解的读者可以通过该编号查询完整论文。**研究概要**假设你有一位助理,学识渊博,但所有知识…...
OpenCV实战:工业相机Bayer数据高效转换与图像处理全流程
1. 工业相机Bayer格式基础解析 第一次接触工业相机输出的Bayer格式数据时,我盯着那些看起来像黑白噪点的图像完全摸不着头脑。后来才发现,这其实是工业视觉领域最常见的原始数据格式之一。Bayer格式的本质是单通道马赛克阵列,每个像素点只记录…...
全志V853开发板驱动7寸RGB屏:Linux DRM设备树配置与调试实战
1. 项目概述:当开发板遇上七寸RGB屏最近在折腾百问网的100ASK_V853-PRO开发板,发现一个挺有意思的需求:让它驱动一块七寸的RGB接口屏幕。这听起来像是个简单的“接线-点亮”的活儿,但真上手了才发现,从硬件引脚匹配、设…...
从CRUD到高薪:收藏这份程序员升级大模型学习指南,抓住AI时代红利!
作者分享个人从普通程序员通过学习AI大模型实现薪资翻倍的经历。文章指出,AI时代程序员最危险的不是被AI取代,而是重复低水平代码工作而不自知。作者从ChatGPT出现后的警醒,到深入学习大模型应用与算法,最终实现职业突破。强调普通…...
CNAS实验室一份完整的质量手册需要包含哪些要素?一文教会质量手册编写
编写质量管理体系文件是CNAS实验室认证工作中非常重要的一个环节,实验室质量管理体系文件按照惯例,一般会分为四个层级,质量手册、程序文件、作业指导书和记录文件。实验室质量手册是实验室依据相关标准制定的纲领性文件,系统规定…...
WLED与xLights打造音乐同步LED灯光秀:从硬件连接到创意编排
1. 项目概述:从独立闪烁到交响乐章如果你玩过像NeoPixel这类可单独寻址的LED灯带,肯定体验过那种让灯光随心所欲流动的快感。但不知道你有没有想过,把这些闪烁的光点从简单的循环动画,升级成一场能与音乐节拍精准共舞、充满叙事感…...
UP Squared 6000工业级创客板:边缘AIoT开发与部署实战指南
1. 项目概述:UP Squared 6000,一块能“扛事”的工业级创客板在工业自动化和边缘AIoT项目里摸爬滚打这么多年,我经手过不少开发板,从早期的树莓派到各种国产派,再到工业级的工控机。很多时候,我们面临一个尴…...
