查找一般分为有序查找和无序查找,这边在讲有序查找

例二分查找

        二分查找就是在有序数组中,通过mid=(low+high)/2来判定中间值,将中间值与待查找的值进行比较,如果待查找的值大于中间值,那么就将范围缩小,查找右边;如果待查找的值小于中间值,那么查找左边;如果待查找的值等于中间值,查找成功。

int BinarySearch(int R[],int n, int K){
//在数组R中对半查找K,R中关键词递增有序int low = 1, high = n, mid;while(low <= high){ //在Rlow…Rhigh之间查找Kmid=(low+high)/2;if(K<R[mid]) high=mid-1; //在左半部分查找else if(K>R[mid]) low=mid+1; //在右半部分查找else return mid; //查找成功}return -1; //查找失败
}

          在该算法中确定比较值是非常重要的一件事,不同的比较值的确定可以决定不同的时间复杂度。所以还可以拓展出类似斐波那契查找,插值查找之类的算法。

二叉查找树

例1.查找

        其实二叉查找树在这边更像是一种结构,就是结点的左孩子一定小于结点,结点右孩子一定大于结点。查找到数据之后往往还要对数据进行处理,在处理过后还要保持原有结构,是比较困难的地方。

BSTnode* Search2(BSTnode* root, int K){ BSTnode* p = root;while (p != NULL) {if (K < p->key) p = p->left;else if (K > p->key) p = p->right;else return p;}return NULL;
}

例2.插入

就是找到对应的位置,然后建立新的结点。

void Insert(BSTnode* &root, int K){if (root == NULL) root = new BSTnode(K); else if (K < root->key) Insert(root->left, K);else if (K > root->key) Insert(root->right, K);
}

例3.删除

        这边的删除是在二叉树中一定有值等于k的结点的情况下,否则要修改一些代码。

void remove(BSTnode* &root, int K) {if(root==NULL) return;if(K<root->key) remove(root->left, K); //在左子树删Kelse if(K>root->key) remove(root->right, K); //在右子树删Kelse if(root->left!=NULL && root->right!=NULL){BSTnode *s=root->right;while(s->left!=NULL) s=s->left;root->key=s->key; //s为t右子树中根序列第一个结点remove(root->right, s->key);}else{ BSTnode* oldroot=root;root=(root->left!=NULL)? root->left:root->right;delete oldroot;}
}

例4.高度平衡树

        高度平衡树是二叉查找树中的一种,它的左右孩子的高度差不会大于1,它通过变形、旋转,让树的结构变得相对“矮胖”,方便后续处理缩小时间。但是这种结构就会对数据操作的过程提出很多额外的要求。

        下面是关于旋转的一些基本操作。这边的代码都比较抽象,适合配合图形理解。

        以LL为例,就是新插入的结点,在A结点的左孩子的左子树上(A结点是从下往上数第一个不平衡的点),插入之后导致不再平衡。于是A结点的左孩子(设为B结点)的右孩子单独拎出来,把右孩子变成A结点的左孩子,然后将这个拎出的B结点作为新的结点,它的右孩子连接到A结点上。

struct AVLnode {int key; //关键词int height; //以该结点为根的子树高度AVLnode *left, *right;AVLnode(int K){ key=K; height=0; left=right=NULL; }
};
int Height(AVLnode *t){ return(t==NULL)?-1:t->height; }
int max(int a, int b){ return (a>b)? a:b; }
void UpdateHeight(AVLnode *t){t->height = max(Height(t->left),Height(t->right))+1;
}void LL(AVLnode* &A) {AVLnode *B = A->left;A->left = B->right;B->right = A;UpdateHeight(A);UpdateHeight(B);A = B;
}void RR(AVLnode* &A) {AVLnode *B = A->right;A->right = B->left;B->left = A;UpdateHeight(A);UpdateHeight(B);A = B;
}void RL(AVLnode* &A){LL(A->right);RR(A);
}void LR(AVLnode* &A) {RR(A->left);LL(A);
}

AVL树插入算法的实现

void ReBalance(AVLnode* &t) {if(t==NULL) return;if(Height(t->left) - Height(t->right)==2){ if(Height(t->left->left) >= Height(t->left->right)) LL(t);elseLR(t);}else if(Height(t->right) - Height(t->left)==2){if(Height(t->right->right) >= Height(t->right->left)) RR(t);elseRL(t);}UpdateHeight(t);
}void Insert(AVLnode* &root, int K) {if(root==NULL) root=new AVLnode(K);else if(K < root->key) //在左子树插入Insert(root->left, K);else if(K > root->key) //在右子树插入Insert(root->right, K);ReBalance(root);
}

AVL树删除算法的实现

void remove(AVLnode* &root, int K) {if(root==NULL) return;if(K<root->key) remove(root->left, K); //在左子树删Kelse if(K>root->key) remove(root->right, K); //在右子树删Kelse if(root->left!=NULL && root->right!=NULL){AVLnode *s=root->right;while(s->left!=NULL) s=s->left;root->key=s->key; //s为t右子树中根序列第一个结点remove(root->right, s->key);}else{ AVLnode* oldroot=root;root=(root->left!=NULL)? root->left:root->right;delete oldroot;}ReBalance(root);
}

所以其实比起怎么插入、删除,更重要的是怎么保持原来的结构

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

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

相关文章

几款开源的安全监控与防御工具分享

安全监控与防御工具概述 在现代网络安全架构中,合理选择和部署一系列的安全监控、检测、响应工具至关重要。下面我们将介绍一些常见的安全工具,包括 Elkeid、Wazuh、Caldera、ELK、Snort、Suricata、OpenHFW、OSSEC、GScan 和 Sysom,并详细介绍它们的下载链接、用处、使用方…

Elasticsearch:ES|QL 改进的时间线

作者&#xff1a;来自 Elastic Toms Mura 让我们回顾一下 ES|QL 的历史和它的改进。 更多阅读&#xff0c;Elasticsearch&#xff1a;ES|QL 查询展示。 Elasticsearch 配备了众多新功能&#xff0c;帮助你为自己的用例构建最佳搜索方案。查看我们的示例笔记本了解更多内容&…

Linux | Bash 子字符串提取

注&#xff1a;本文为 “ Bash 子字符串提取” 相关合辑。 英文引文&#xff0c;机翻未校。 如有内容异常&#xff0c;请看原文。 How to Extract Bash Substring? [5 methods] 如何提取 Bash 子字符串&#xff1f;[5 种方法] 2024-04-28 00:00:00 In Bash, a substring is…

Vue2 前端开发 - vue-quill-editor 富文本编辑器(编辑器基础案例、编辑器配置参数解读、编辑器事件)

一、vue-quill-editor 1、vue-quill-editor 概述vue-quill-editor 是一个基于 Quill 富文本编辑器的 Vue 组件vue-quill-editor 在 Vue 2 项目中可以很方便地集成与使用2、vue-quill-editor 安装 执行如下指令&#xff0c;安装 vue-quill-editor npm install vue-quill-editor …

断网情况下,网线直连 Windows 笔记本 和Ubuntu 服务器

在断网情况下&#xff0c;通过网线直连 Windows 笔记本 和 Ubuntu 服务器&#xff0c;并使用 VSCode 访问服务器及 Docker 容器 的步骤如下&#xff1a;1. 物理连接&#xff08;网线直连&#xff09; 1.1 使用网线连接 用 网线&#xff08;Cat5e 或更高&#xff09; 连接 Windo…

消息队列总结

为什么需要消息队列&#xff1f; 随着互联网快速发展&#xff0c;业务规模不断扩张&#xff0c;技术架构从单体演进到微服务&#xff0c;服务间调用复杂、流量激增。为了解耦服务、合理利用资源、缓冲流量高峰&#xff0c;「消息队列」应运而生&#xff0c;常用于异步处理、服务…

C#引用转换核心原理:类型视角切换

&#x1f50d; C#引用转换核心原理&#xff1a;类型视角切换 引用类型由内存指针和类型标记组成&#xff08;如图1&#xff09;。引用转换不改变内存地址&#xff0c;仅改变编译器识别对象的“视角”&#xff1a; B myVar1 new B(); // 实际B类型对象 A myVar2 (A)myV…

重要发布丨MaxKB V2正式发布,助力用户快速构建企业级智能体

2025年7月18日&#xff0c;MaxKB V2版本正式发布。MaxKB是一个强大易用的企业级智能体平台&#xff0c;致力于解决企业AI落地所面临的技术门槛高、部署成本高、迭代周期长等问题&#xff0c;让企业用户落地AI更简单。 秉承“开箱即用&#xff0c;伴随成长”的设计理念&#xff…

大语言模型任务分解与汇总:从认知瓶颈到系统化解决方案

一、缘起&#xff1a;为什么大模型需要"分而治之" 1.1 从一个真实场景说起 设想这样一个场景&#xff1a;你要求GPT-4帮你完成一份包含市场调研、竞品分析、财务预测和战略规划的商业计划书。即使是最先进的大模型&#xff0c;面对这样的复杂任务也会"力不从心&…

Spring核心注解@RequestMapping详解

RequestMapping 是 Spring Framework 中一个核心注解&#xff0c;用于在 Spring MVC&#xff08;或 Spring WebFlux&#xff09;中将 HTTP 请求映射到特定的处理器&#xff08;Controller 中的方法&#xff09;或处理器类。它告诉 Spring 框架&#xff1a;当一个匹配特定条件的…

OSPF路由协议的协商过程

OSPF的知识点非常多&#xff0c;协议过程也是一个不大不小的知识点&#xff0c;今天就简单的说一下&#xff0c;OSPF是如何进行协商的。OSPF&#xff08;Open Shortest Path First&#xff09;协议是一种用于路由选择的动态链路状态协议&#xff0c;是大型网络普遍使用的动态路…

MySql:索引,结构

文章目录注意事项结构注意事项 主键字段在建表时&#xff0c;会自动创建主键索引添加唯一约束时&#xff0c;数据库实际上会添加唯一索引。 解释&#xff1a; 增&#xff1a;创建&#xff1a; create [unique] index 索引名 on 表名 (字段名……)&#xff1b;-- 举例 :给tb…

ts学习2

JavaScript 中的每个值都有一组行为&#xff0c;您可以通过运行不同的操作来观察这些行为。这听起来很抽象&#xff0c;但作为一个简单的例子&#xff0c;考虑我们可能在名为 message 的变量上运行的一些操作。 // Accessing the property toLowerCase // on message and then…

k8s环境使用Operator部署Seaweedfs集群(下)

作者&#xff1a;闫乾苓 文章目录4.4.3 部署seaweedfs集群4.4.4 验证集群运行状态4.4.5 测试集群功能4.4.3 部署seaweedfs集群 集群Yaml示例 apiVersion: seaweed.seaweedfs.com/v1 kind: Seaweed metadata:name: seaweed1namespace: default spec:image: chrislusf/seaweedf…

【橘子分布式】gRPC(理论篇)

一、简介 我们在前面学习了thrift rpc的知识&#xff0c;我们从其中接触到了IDL&#xff0c;编解码协议&#xff0c;服务的远程调用(调用远程服务就像在在本地调用一样)等各种概念。 其实我个人对thrift的使用并不多&#xff0c;我更多的是使用今天我们要提到的一个RPC框架称之…

OSPF高级特性之GR

一、概述OSPF GR(Graceful Restart),在路由器发生故障或管理员干预的情况下重启了OSPF进程时,重新构建控制平面时,转发平面不受影响,仍可以正常转发数据。在我们OSPF网络环境当中,假设路由器为框式路由器,通常框式路由器有多个主控板,当主主控板发生故障时会切换到备主控板上。…

iOS 构建配置与 AdHoc 打包说明

iOS 构建配置与 AdHoc 打包说明 1. 背景 在 iOS 项目中&#xff0c;通常需要支持 多个环境的构建和分发&#xff0c;比如&#xff1a; 开发环境 (Debug) → 本地调试内测环境 (AdHoc) → 提供 QA / 产品经理测试预发布环境 (AdHoc_Release) → 和正式版配置一致&#xff0c;但通…

【52】MFC入门到精通——MFC串口助手(二)---通信版(发送数据 、发送文件、数据转换、清空发送区、打开/关闭文件),附源码

文章目录1 完整 功能展示2 添加控件变量及声明2.1 添加控件及变量2.2 SerialPortDlg.h: 头文件3 函数实现3.1 数据发送3.1.2 写数据、字符串转3.2 发送文件3.2.1 打开文件3.2.2 发送文件3.3 清空发送区4 完整MFC项目项下载1 完整 功能展示 串口通信助手 页面展示&#xff0c;功…

笔试——Day12

文章目录第一题题目思路代码第二题题目&#xff1a;思路代码第三题题目&#xff1a;思路代码第一题 题目 删除公共字符 思路 模拟&#xff1a; 遇到需要删除的字符&#xff0c;则不添加到结果中 代码 第二题 题目&#xff1a; 两个链表的第一个公共结点 思路 模拟&#x…

SpringMVC @ResponseBody注解详解

概要ResponseBody是 Spring MVC 中的一个重要注解&#xff0c;用于指示方法的返回值应该直接作为 HTTP 响应体返回&#xff0c;而不是解析为视图名称。基本功能ResponseBody主要用于将Java对象转换为HTTP响应体&#xff08;通常是JSON或XML&#xff09;绕过视图解析器直接返回数…