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

西安关键词优化服务/seo关键词搜索优化

西安关键词优化服务,seo关键词搜索优化,淄博学校网站建设定制,电商客服怎么做如何从零开始二叉搜索树的基本性质 二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树,它具有以下特征: 1. 节点结构:每个节点包含一个键(key)和值(value),以及指…

二叉搜索树的基本性质

二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树,它具有以下特征:

1. 节点结构:每个节点包含一个键(key)和值(value),以及指向左子树和右子树的指针。

2. 左子树和右子树的性质:
   - 对于每个节点,左子树中所有节点的键都小于该节点的键。
   - 右子树中所有节点的键都大于该节点的键。
   - 这种特性使得二叉搜索树可以高效地进行查找、插入和删除操作。

3. 查找操作:从根节点开始,比较目标键与当前节点的键。如果目标键小于当前节点的键,则继续在左子树中查找;如果大于,则在右子树中查找。这个过程递归进行,直到找到目标节点或者到达树的叶子节点。

4. 插入操作:插入新节点时,同样从根节点开始,根据二叉搜索树的性质,选择左子树或右子树,直到找到一个空位置插入新节点。

5. 删除操作:删除节点较为复杂,分为三种情况:
   - 若被删除节点为叶子节点,直接移除。
   - 若被删除节点只有一个子节点,则用其子节点替代该节点。
   - 若被删除节点有两个子节点,则需要找到该节点的后继节点(通常是右子树中最小的节点),用其替代被删除的节点,并递归删除后继节点。

二叉搜索树的平均时间复杂度为O(log n),但在最坏情况下(如插入顺序导致树变为链表),其时间复杂度可达到O(n)。为了避免这一问题,通常会使用自平衡的二叉搜索树,如红黑树或AVL树。

二叉搜索树在许多应用中非常重要,包括数据库索引、内存中的排序数据以及许多算法实现等。

代码实现二叉搜索树的基本操作

查找操作

二叉搜索树(BST)中的查找操作是基于树的特性进行的,具体原理如下:

查找操作原理

  1. 初始化当前节点(cur):

    • 将当前节点设置为树的根节点(root),开始从树的顶端进行查找。
  2. 循环查找:

    • 使用while循环遍历树的节点,条件是cur不为null(即当前节点存在)。
  3. 比较当前节点与目标值:

    • 左子树查找:如果当前节点的值小于目标值,说明目标值可能在右子树中,因此将cur指向cur.right
    • 右子树查找:如果当前节点的值大于目标值,说明目标值可能在左子树中,将cur指向cur.left
    • 找到目标值:如果当前节点的值等于目标值,则查找成功,返回true
  4. 查找结束:

    • 如果循环结束,意味着没有找到目标值,此时返回false

代码实现:

public boolean search(int val) {// 初始化当前节点为根节点treeNode cur = root;// 当当前节点不为空时循环查找while (cur != null) {// 如果当前节点的值小于目标值,则在右子树继续查找if (cur.val < val) {cur = cur.right;// 如果当前节点的值大于目标值,则在左子树继续查找} else if (cur.val > val) {cur = cur.left;// 如果找到目标值,返回true} else {return true;}}// 如果遍历结束仍未找到目标值,返回falsereturn false;
}

查找操作利用了二叉搜索树的排序性质,能够在相对较短的时间内找到目标值。通过比较和递归向左或向右子树移动,该操作在实际应用中被广泛使用,例如在需要快速检索数据的系统中,如数据库和内存中的索引结构等。

插入操作

二叉搜索树(Binary Search Tree, BST)的插入操作是基于树的特性进行的,以下是插入操作的原理详解:

插入操作原理

  1. 开始插入

    • 从树的根节点开始进行插入操作。
  2. 比较键值

    • 对于当前节点,比较要插入的值(key)与当前节点的键(val):
      • 如果要插入的值小于当前节点的键,则应该将其插入到左子树中。
      • 如果要插入的值大于当前节点的键,则应该将其插入到右子树中。
      • 如果要插入的值等于当前节点的键,通常视为重复值,根据具体需求,可以选择不插入、更新值或者其他处理。
  3. 寻找空位

    • 将当前节点更新为其左子树或右子树,然后重复该过程,直到找到一个空位置(即当前节点为null)。
    • 该空位置即为将新值插入树中的位置。
  4. 插入新节点

    • 在找到的空位置创建新的节点,并将其插入到树中。

 代码实现:

    public boolean insert(int val) {treeNode node = new treeNode(val);if(root == null) {root = node;return true;}treeNode cur = root;treeNode parent = null;while(cur != null) {if(val > cur.val) {parent = cur;cur = cur.right;}else if(val < cur.val) {parent = cur;cur = cur.left;}else {return false;}}if(val > parent.val) {parent.right = node;}else {parent.left = node;}return true;}

插入操作遵循了二叉搜索树的基本特性,通过比较和递归地前进来在合适的位置插入新节点。这一操作是保持树的结构的关键,确保每次插入后都能满足二叉搜索树的性质,以便后续的查找、删除等操作更加高效。

删除操作

  1. 查找要删除的节点

    • 从根节点开始,通过与当前节点的值比较,找到目标节点。如果目标值大于当前节点值则继续查找右子树;如果小于,则查找左子树。同时记录当前节点的父节点。
  2. 执行删除操作

    • 一旦找到要删除的节点,调用removeNode方法,根据要删除节点的子节点情况执行不同的删除逻辑。

代码实现:

public void remove(int key) {treeNode cur = root;        // 当前节点初始化为根节点treeNode parent = null;     // 记录当前节点的父节点// 找到要删除的节点while(cur != null) {if(key > cur.val) {parent = cur;       // 更新父节点cur = cur.right;    // 向右子树查找} else if(key < cur.val) {parent = cur;       // 更新父节点cur = cur.left;     // 向左子树查找} else {// 找到目标节点,执行删除逻辑removeNode(parent, cur);return;            // 找到并删除后退出}}System.out.println("没有该节点"); // 如果节点未找到,输出提示信息
}// 执行删除操作的方法
private void removeNode(treeNode parent, treeNode cur) {// 情况1:要删除的节点没有左子节点if(cur.left == null) {if(cur == root) {root = cur.right;  // 如果要删除的节点是根节点,更新根节点} else if(cur == parent.left) {parent.left = cur.right; // 更新父节点的左子指针} else {parent.right = cur.right; // 更新父节点的右子指针}}// 情况2:要删除的节点没有右子节点else if(cur.right == null) {if(cur == root) {root = cur.left;   // 如果要删除的节点是根节点,更新根节点} else if(cur == parent.left) {parent.left = cur.left; // 更新父节点的左子指针} else {parent.right = cur.left; // 更新父节点的右子指针}}// 情况3:要删除的节点有两个子节点else {// 找到要删除节点的右子树中的最小节点treeNode target = cur.right;treeNode targetParent = cur;// 寻找右子树中最小节点while(target.left != null) {targetParent = target; // 更新最小节点的父节点target = target.left;   // 持续向左查找}// 用找到的最小节点的值替代要删除的节点的值cur.val = target.val;// 删除最小节点if(target == targetParent.right) {targetParent.right = target.right; // 更新父节点的右子指针} else {targetParent.left = target.right;  // 更新父节点的左子指针}}
}
  1. 查找节点

    • 使用while循环查找目标节点,记录其父节点,以便于后续的删除操作。比较节点值,并依据结果移动到左或右子树。
  2. 删除逻辑

    • 没有左子节点:直接将右子节点连接到父节点,删除当前节点。
    • 没有右子节点:直接将左子节点连接到父节点,同样删除当前节点。
    • 有两个子节点:找到右子树中最小的节点(后继节点),用其值替代当前节点的值,然后递归删除后继节点。
  3. 输出信息

    • 如果在树中找不到目标节点,输出“没有该节点”提示。

性能分析

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。
对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。
但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树:

最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:\log _{2}^{n}
最差情况下,二叉搜索树退化为单支树,其平均比较次数为:\frac{n}{2}

相关文章:

【数据结构】Java实现二叉搜索树

二叉搜索树的基本性质 二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;是一种特殊的二叉树&#xff0c;它具有以下特征&#xff1a; 1. 节点结构&#xff1a;每个节点包含一个键&#xff08;key&#xff09;和值&#xff08;value&#xff09;&#xff0c;以及指…...

钉钉小程序如何通过setdate重置对象

在钉钉小程序中&#xff0c;通过setData方法来重置对象&#xff08;即更新对象中的数据&#xff09;是一个常见的操作。然而&#xff0c;需要注意的是&#xff0c;钉钉小程序&#xff08;或任何小程序平台&#xff09;的setData方法在处理对象更新时有一些特定的规则和最佳实践…...

DjangoRF-10-过滤-django-filter

1、安装pip install django-filter https://pypi.org/ 搜索django-filter基础用法 2、进行配置 3、进行内容调试。 4、如果碰到没有关联的字段。interfaces和projects没有直接关联字段&#xff0c;但是interface和module有关联&#xff0c;而且module和projects关联&#x…...

Android SurfaceFlinger——GraphicBuffer的生成(三十二)

通过前面的学习我们知道,在 SurfaceFlinger 中使用的生产者/消费者模型,Surface 做为生产者一方存在如下两个比较重要的函数: dequeueBuffer:获取一个缓冲区(GraphicBuffer),也就是 GraphicBuffer 生成。queueBuffer :把缓冲区(GraphicBuffer)放入缓冲队列中。 …...

<数据集>棉花识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;13765张 标注数量(xml文件个数)&#xff1a;13765 标注数量(txt文件个数)&#xff1a;13765 标注类别数&#xff1a;4 标注类别名称&#xff1a;[Partially opened, Fully opened boll, Defected boll, Flower] 序…...

[240730] OpenAI 推出基于规则的奖励机制 (RBR) 提升模型安全性 | 英特尔承认其13、14代 CPU 存在问题

目录 OpenAI 推出基于规则的奖励机制&#xff08;RBR&#xff09;提升模型安全性英特尔承认其 13、14代 CPU 存在问题 OpenAI 推出基于规则的奖励机制&#xff08;RBR&#xff09;提升模型安全性 为了解决传统强化学习中依赖人工反馈的低效问题&#xff0c;OpenAI 开发了基于规…...

【JavaScript】展开运算符详解

文章目录 一、展开运算符的基本用法1. 展开数组2. 展开对象 二、展开运算符的实际应用1. 合并数组2. 数组的浅拷贝3. 合并对象4. 对象的浅拷贝5. 更新对象属性 三、展开运算符的高级用法1. 在函数参数中使用2. 嵌套数组的展开3. 深拷贝对象4. 动态属性名 四、注意事项和最佳实践…...

麒麟V10系统统一认证子系统国际化

在适配麒麟V10系统统一认证子系统国际化过程中&#xff0c; 遇到了很多的问题&#xff0c;关键是麒麟官方的文档对这部分也是粗略带过&#xff0c;遇到的问题有: &#xff08;1&#xff09;xgettext无法提取C源文件中目标待翻译的字符串。 &#xff08;2&#xff09;使用msgf…...

C语言进阶 13. 文件

C语言进阶 13. 文件 文章目录 C语言进阶 13. 文件13.1. 格式化输入输出13.2. 文件输入输出13.3. 二进制文件13.4. 按位运算13.5. 移位运算13.6. 位运算例子13.7. 位段 13.1. 格式化输入输出 格式化输入输出: printf %[flags][width][.prec][hlL]type scanf %[flags]type %[fl…...

LinuxCentos中ELK日志分析系统的部署(详细教程8K字)附图片

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…...

Vscode ssh Could not establish connection to

错误表现 上午还能正常用vs code连接服务器看代码&#xff0c;中午吃个饭关闭vscode再重新打开输入密码后就提示 Could not establish connection to xxxx 然后我用终端敲ssh的命令连接&#xff0c;结果是能正常连接。 解决方法 踩坑1 网上直接搜Could not establish con…...

数字陷波器的设计和仿真(Matlab+C)

目录 一、数字陷波器的模型 二、Matlab仿真 1. 示例1 2. 示例2 三、C语言仿真 1. 由系统函数计算差分方程 2. 示例代码 一、数字陷波器的模型 二、Matlab仿真 1. 示例1 clear clc f0=100;%滤掉的100Hz fs=1000;%大于两倍的信号最高频率 r=0.9; w0=2*pi*f0/fs;%转换到…...

[玄机]流量特征分析-常见攻击事件 tomcat

题目网址【玄机】&#xff1a;https://xj.edisec.net/ Tomcat是一个开源的Java Servlet容器&#xff0c;它实现了Java Servlet和JavaServer Pages (JSP) 技术&#xff0c;提供了一个运行这些应用程序的Web服务器环境。Tomcat由Apache软件基金会的Jakarta项目开发&#xff0c;是…...

【TOOLS】Project 2 Maven Central

发布自己的项目到maven中央仓库 Maven Central Account 访问&#xff1a;https://central.sonatype.com/&#xff0c;点击右上角&#xff0c;根据提示注册账号 构建User token &#xff0c;用于访问中央仓库的API&#xff1a; 点击右上角&#xff0c;查看账户点击Generate Us…...

【Opencv】模糊

消除噪声 用该像素周围的平均值代替该像素值 4个函数 blur():最经典的 import os import cv2 img cv2.imread(os.path.join(.,dog.jpg)) k_size 7 #窗口大小&#xff0c;数字越大&#xff0c;模糊越强 img_blur cv2.blur(img,(k_size,k_size)) #窗口是正方形&#xff…...

函数式编程范式

文章目录 函数式编程范式不可变性&#xff08;Immutable&#xff09;纯函数&#xff08;Pure Functions&#xff09;函数作为一等公民&#xff08;First-Class Functions&#xff09;高阶函数&#xff08;Higher-Order Functions函数组合&#xff08;Function Composition&…...

特征缩放的秘籍:sklearn中的数据标准化技术

特征缩放的秘籍&#xff1a;sklearn中的数据标准化技术 在机器学习中&#xff0c;特征缩放&#xff08;Feature Scaling&#xff09;是数据预处理的重要步骤&#xff0c;它确保了不同量纲和范围的特征在模型训练中具有相同的重要性。Scikit-learn&#xff08;简称sklearn&…...

hdfs文件系统

简述什么是HDFS&#xff0c;以及HDFS作用 &#xff1f; HDFS在Hadoop中的作用是为海量的数据提供了存储&#xff0c;能提供高吞吐量的数据访问&#xff0c;HDFS有高容错性的 特点&#xff0c;并且设计用来部署在低廉的硬件上&#xff1b;而且它提供高吞吐量来访问应用程序的数…...

基于STM32设计的个人健康检测仪(华为云IOT)(191)

基于STM32设计的个人健康检测仪(华为云IOT)(191) 文章目录 一、设计需求1.1 设计需求总结1.2 设计思路【1】整体设计思路【2】整体构架【3】ESP8266模块配置【4】上位机开发思路【5】供电方式1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】课题研究的意义【…...

面试:CUDA Tiling 和 CPU tiling 技术详解

目录 一、CUDA Tiling 和 CPU Tiling 技术概述 &#xff08;一&#xff09;技术原理 &#xff08;二&#xff09;应用场景 &#xff08;三&#xff09;优势和劣势 二、Tiling 技术在深度学习中的应用 三、Tiling 技术的缺点 一、CUDA Tiling 和 CPU Tiling 技术概述 Til…...

SQL语句中,`TRUNCATE` 和 `DELETE`的区别

TRUNCATE 和 DELETE 是 SQL 中用于删除表中数据的两种命令&#xff0c;它们有一些关键区别&#xff1a; 1. 基本区别 DELETE: 删除表中的数据&#xff0c;但不会删除表结构和索引。可以使用 WHERE 子句来删除特定的记录&#xff0c;也可以不使用 WHERE 子句来删除所有记录。会…...

【Git】.gitignore全局配置与忽略匹配规则详解

设置全局配置 1&#xff09;在C:/Users/用户名/目录下创建.gitignore文件&#xff0c;在里面添加忽略规则。 如何创建 .gitignore 文件&#xff1f; 新建一个.txt文件&#xff0c;重命名&#xff08;包括后缀.txt&#xff09;为 .gitignore 即可。 2&#xff09;将.gitignore设…...

基于 YOLO V10 Fine-Tuning 训练自定义的目标检测模型

一、YOLO V10 在本专栏的前面几篇文章中&#xff0c;我们使用 ultralytics 公司开源发布的 YOLO-V8 模型&#xff0c;分别 Fine-Tuning 实验了 目标检测、关键点检测、分类 任务&#xff0c;实验后发现效果都非常的不错&#xff0c;但它已经不是最强的了。最新的 YOLO-V10 已经…...

Java学习2

1 如果要使用Long类型的变量&#xff0c;在数据值的后面加上L为后缀&#xff08;可以是大写也可以是小写&#xff09;&#xff0c;例如 Long i9999999L; 2 如果要使用float类型的变量&#xff0c;在数据值的后面加上F为后缀&#xff08;可以是大写也可以是小写&#xff09;&a…...

CSS、less、 Sass、

1 CSS 1.1 css中.a.b 与 .a .b(中间有空格)的区别 区别: .a.b是获取同时含有a和b的元素.a .b(中间有空格),是获取.a元素下的所有.b元素<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name=&quo…...

北京大学:利用好不确定性,8B小模型也能超越GPT-4

大模型有一个显著的特点&#xff0c;那就是不确定性——对于特定输入&#xff0c;相同的LLM在不同解码配置下可能生成显著不同的输出。 比如问一问chatgpt“今天开心吗&#xff1f;”&#xff0c;可以得到两种不同的回答。 常用的解码策略有两种&#xff0c;一个是贪婪解码&am…...

​​​​​​​哪些云服务商已通过了等保2.0合规性评估?​​​​​​​

已通过等保2.0合规性评估的云服务商 根据最新的搜索结果&#xff0c;以下是已通过等保2.0合规性评估的云服务商&#xff1a; 阿里云&#xff1a;阿里云的“电子政务云平台系统”是全国首个通过等保2.0国标测评的云平台&#xff0c;显示了其在云计算领域的安全合规能力。华为云…...

PHP在线加密系统源码

历时半年&#xff0c;它再一次迎来更新[飘过] 刚刚发的那个有点问题&#xff0c;重新修了一下 本次更新内容有点多 1. 更新加密算法&#xff08;这应该是最后一次更新加密算法了&#xff0c;以后主要更新都在框架功能上面了&#xff09; 2. 适配php56-php74 3. 取消批量加…...

OpenCV学习笔记 比较基于RANSAC、最小二乘算法的拟合

一、RANSAC算法 https://skydance.blog.csdn.net/article/details/134887458https://skydance.blog.csdn.net/article/details/134887458 二、最小二乘算法 https://skydance.blog.csdn.net/article/details/115413982...

前端JS特效第53集:带声音的烟花模拟绽放特效插件

带声音的烟花模拟绽放特效插件&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>Firework Simulator v2&…...