算法通关村第九关 | 二叉树查找和搜索树原理

news2025/1/19 16:21:13

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的时候最高点索引是1
        if (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,因此,我们可以根据这一条性质,通过二分查找方法找出最小值。

  1. 第一种情况nums[pivot] < nums[high] ,这说明nums[pivot]是最小值右侧的元素,因此我们可以忽略右半部分,

  2. 第二种情况nums[pivot] > nums[high],这说明nums是最小值左侧元素,因此我们可以忽略二分查找的左半部分

  3. 由于数组中不包含重复元素,并且只要当前区间长度不为1,pivot就不会和high重合;而如果当前的区间长度为1.这说明我们已经可以结束二分查找了。因此不会存在nums[pivot] = nums[high]的情况。

  4. 当二分查找结束时,我们就找到最小值所在的位置。

 图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;
        }
        //访问当前节点,如果当前节点小于等于中序遍历的前一个结点,说明不满足BST
        if (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)

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

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

相关文章

Docker容器与虚拟化技术:Docker容器操作、网络模式

目录 一、理论 1.Docker 容器操作 2.Docker 网络 二、实验 1.Docker 容器操作 2.Docker 网络 2.Docker 的网络模式 三、问题 1. 批量删除所有容器未生效 2.使用bridge模式指定IP运行docker报错 3.未显示bridge网络模式名称 四、总结 一、理论 1.Docker 容器操作 &a…

TVP助力数智化转型:数字物业与产业园区智慧化高质量发展

引言 数字化技术的蓬勃发展&#xff0c;为传统行业转型提供了前所未有的机遇。相较于早期的基础数字化&#xff0c;现如今数字化转型已逐步踏入更深层次。在各个领域&#xff0c;将数字技术与实际应用有机融合已日益显得迫切。如何在这一浪潮中巧妙融合数字技术与传统行业&…

cesium加载wms服务

成果图 源码 cesium加载不用像其他api一样加那么多参数&#xff0c;最终请求路径上发现他也是把那些参数都加上了&#xff0c;应该是有默认的参数吧 var wmsLayer new Cesium.WebMapServiceImageryProvider({url: http://你的地址/pjgeoserver/services/wms,layers: services…

Golang协程,通道详解

进程、线程以及并行、并发 关于进程和线程 进程&#xff08;Process&#xff09;就是程序在操作系统中的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;进程是一个动态概念&#xff0c;是程序在执行过程中分配和管理资源的基本单位&#xff0c;每一…

leetcode611. 有效三角形的个数(java)

有效三角形的个数 有效三角形的个数排序加二分排序 双指针 上期算法 有效三角形的个数 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使…

python进阶做题日记365-1,

第一天&#xff1a; 1&#xff1a;题目名称&#xff1a;代写匿名信时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述小Q想要匿名举报XX领导不务正业&#xff01; 小Q害怕别人认出他的字迹。 他选择从报纸上剪裁下来英文字母组成自己的举报信。 现在小Q找来了报纸…

【分布式存储】数据存储和检索~倒排索引pageRank

为什么需要倒排索引 通过前两篇的文章介绍&#xff0c;B树主要针对的是读多写少的场景&#xff0c;而LSM针对的是写多读少的场景&#xff0c;其实在日常开发中&#xff0c;我们会将数据存储到搜索引擎中&#xff0c;然后进行数据的搜索&#xff0c;这种场景其实针对的是快速根…

AI幕后的关键技术之一——HBM

半导体产业步入下行周期之际&#xff0c;2023年ChatGPT的“走红”为产业带来新的发展方向&#xff1a;AI人工智能。 ChatGPT正掀起一场声势浩大的AI浪潮&#xff0c;AI时代下&#xff0c;为满足海量数据存储以及日益增长的繁重计算要求&#xff0c;半导体存储器领域也迎来新的变…

shell第九章iptables防火墙

防火墙&#xff1a;隔离功能 部署点&#xff1a;部署在网络边缘&#xff0c;或者主机边缘&#xff0c;在工作中&#xff0c;防火墙的主要作用&#xff0c;决定那些数据可以被外网访问&#xff0c;以及哪些数据可以进入内网访问 讨论防火墙&#xff0c;主要就是在网络层进行讨…

无涯教程-Perl - setsockopt函数

描述 此函数将SocketoptionsOPTNAME的值设置为SOCKET上指定级别的OPTVAL值。您需要导入Socket模块,以获取Tabl中显示的OPTNAME的有效值 语法 以下是此函数的简单语法- setsockopt SOCKET, LEVEL, OPTNAME, OPTVAL返回值 如果失败,此函数返回undef&#xff1b;如果成功,则返…

java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration

错误&#xff1a; java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfigurationat org.apache.hadoop.hive.ql.exec.tez.TezSessionPoolSession$AbstractTriggerValidator.startTriggerValidator(TezSessionPoolSession.java:74)at org.apache.hadoop.hive.ql.e…

数据集成革新:去中心化微服务集群的无限潜能

在当今数据密集型的业务环境下&#xff0c;传统的集中式架构已经难以满足高可用性和高并发性的要求。而去中心化微服务集群则通过分散式的架构&#xff0c;将系统划分为多个小型的、独立部署的微服务单元&#xff0c;每个微服务负责特定的业务功能&#xff0c;实现了系统的高度…

bytesec靶场

靶场下载 https://www.vulnhub.com/entry/hacknos-os-bytesec,393/ 下载完成后进入配置修改网卡 教程 配置 第一步&#xff1a;启动靶机时按下 shift 键&#xff0c; 进入以下界面 第二步&#xff1a;选择第二个选项&#xff0c;然后按下 e 键&#xff0c;进入编辑界面 将…

python快速两两元素求相似矩阵

目录 1. 计算相似度矩阵2. 基于sklearn 1. 计算相似度矩阵 计算相似度矩阵的方法有很多种&#xff0c;发现了sklearn中直接有通过计算余弦相似度得到相似度矩阵的方法 1 sklearn.metrics.pairwise.cosine_similarity # 余弦相似度 2 sklearn.metrics.pairwise.pairwise_distan…

【NetCore】09-中间件

文章目录 中间件&#xff1a;掌控请求处理过程的关键1. 中间件1.1 中间件工作原理1.2 中间件核心对象 2.异常处理中间件:区分真异常和逻辑异常2.1 处理异常的方式2.1.1 日常错误处理--定义错误页的方法2.1.2 使用代理方法处理异常2.1.3 异常过滤器 IExceptionFilter2.1.4 特性过…

NTN(六) switchover

NTN中的switchover包括feeder link switchover和 serving link switch。所谓feeder link switchover就是将feeder link从source NTN 网关更改为特定 NTN payload的target NTN 网关的过程。 feeder link switchover是网络层过程。 而service link switch则是指serving NTN paylo…

OpenCV分析tfboys十周年演唱会灯牌大战结果

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》&#xff0c;结合我自己的工作学习经历&#xff0c;我准备写一个音视频系列blog。本文是音视频系…

【代码质量】认知复杂度(COGNITIVE COMPLEXITY)一种衡量可理解性的新方法

白皮书地址 摘要&#xff1a;圈复杂度最初是作为“可测试性和模块控制流的“可维护性”。虽然它擅长于衡量前者&#xff0c;但它的数学模型不能产生一个令人满意的值来衡量后者。本文描述一种打破数学度量模型的新度量模型来评估代码&#xff0c;以弥补圈复杂度的缺点&#xf…

【科研论文配图绘制】task1 掌握科研绘图的基本知识

【科研论文配图绘制】task1 掌握科研绘图的基本知识 写在最前 8月份Datawhale组队学习&#xff0c;写下该博客记录学习内容 1.科研论文配图的分类与构成 2.科研论文配图的格式和尺寸 3.科研论文配图中的字体和字号设置 4.科研论文配图的版式设计、结构布局和颜色搭配 占个…