数据结构——查找(二叉排序树)

news2024/11/15 9:08:41

文章目录

  • 前言
  • 一、二叉排序树
    • 构造二叉排序树步骤
    • 构造二叉排序树步骤图
    • 二叉排序树的查找
      • 二叉排序树查找递归算法
      • 二叉排序树查找非递归算法
    • 二叉排序树的插入
      • 二叉排序树插入结点——递归算法
      • 二叉排序树插入结点——非递归算法
    • 二叉排序树的删除
  • 总结


前言

二叉排序树查找定义
二叉排序树构造
二叉排序树查找递归和非递归算法
二叉排序树插入递归和非递归算法
二叉排序树删除递归和非递归算法


一、二叉排序树

  1. 动态查找表的特点是:
    表结构本身是在查找过程中动态生成的,即对于给定值key,
    若表中存在其关键字等于key的记录,则查找成功返回,否则插入关键字等于key的记录
  2. 定义:简称BST,也称二叉查找树;左子树值全部小于根结点值,右子树值全部大于根结点值,左右子树本身也是二叉排序树,所以二叉排序树中序遍历可以得到一个递增序列
    在这里插入图片描述

构造二叉排序树步骤

在这里插入图片描述

构造二叉排序树步骤图

在这里插入图片描述

二叉排序树的查找

  1. 二叉排序树查找:从根结点开始,沿某一条分支逐层向下进行比较的过程,将给定值与根结点进行比较,若相等,则查找成功;若根结点关键字大于关键字,在根结点左子树中查找,否则在右子树中查找,是一个递归的过程
    在这里插入图片描述

二叉排序树查找递归算法

BiTree SearchBST(BSTNode *T,elemType x)
{
//在根指针T所指二叉树中递归地查找某关键字等于
//key的数据元素,若查找成功,则返回指向该数据元素结点的指针,否则返回空指针
if ((T==NULL||(T->data==x)))  return(T);
else if (x< T->data)  
         return(SearchBST(T->lchild,x));
     else 
          return(SearchBST(T->rchild,x));
}

二叉排序树查找非递归算法

BSTNode SearchBST(BSTNode *T,elemType x)
{
	BSTNode *p=T;
	 while(p!=NULL)
 	  {
	   	if(x==p->data) 
   		return p;
   		else if(x<p->data)
        p=p->lchild;
         else
        p=p->rchild;
     }
   return p;
}


二叉排序树的插入

若关键字k小于根结点关键字,则插入左子树中,相反插入右子树中;一定插入了叶结点中
在这里插入图片描述

二叉排序树插入结点——递归算法

void  insertBST(BSTNode *T,BSTNode *s)
{ if(T==NULL) T=s;
  else if(s->data< p->data)  
            insertBST(T->lchild,s);
       else insertBST(T->rchild,s);
         }
   }

二叉排序树插入结点——非递归算法

void  InsertBST(BSTNode *T,elemType e)
{BSTNode *p=T,*s,*q;
 s=new BSTNode;s->data=e;
 s->rchild=s->lchild=NULL;
if(p==NULL) T=s;
 while(p!=NULL){ 
if(s->data<=p->data){ 
q=p;
              p=p->lchild;
      else{
q=p; 
              p=p->rchild;
}
     }
if(s->data<q->data)
q->lchild=s;
else             
q->rchild=s;  
  }

二叉排序树的删除

二叉排序树的删除:将单个元素删除,其他因为此删除的链再重新组合,确保性质不变
(1)若删除是叶结点,则直接删除
(2)若结点z只有一棵左子树或右子树,则让z的子树成为z父结点的子树,替代z位置
在这里插入图片描述
(3)若结点z有左右两棵子树,则令z的直接后继(或直接前驱)代替z,然后从二叉排序树中删除这个直接后继(或直接前驱)
在这里插入图片描述
6.二叉排序树的查找效率分析
(1)对于高度为H的二又排序树,其插入和删除操作的运行时间都是O(n)。但在最坏的情况下,构造二叉排序树的输入序列是有序的,则会形成一个倾斜的单支树,此时二叉排序树的性能显变坏,树的高度也增加为元素个数N,如下图所示:
在等概率情况下,图4-23(a)的查找成功的平均查找长度为
ASL=(1+2×2+3×4+4×3)/10=2.9
而图4-23(b)的查找成功的平均查找长度为
ASL=(1+2+3+4+5+6+7+8+9+10)/10=5.5
在这里插入图片描述
由上可知,二叉排序树查找算法的平均查找长度,主要取决于树的高度,即与二叉树的形态有关。如果二叉排序树是一个只有右(左)孩子的单支树(类似于有序的单键表),其平均查找长度和单链表相同,为O(n)。如果二义排序树的左、右子树的高度之差的绝对值不超过1,这样的二叉排序树称为平衡二叉树。它的平均查找长度达到 O(log2n)

二叉排序树与二分查找:从查找过程看,二叉排序树与二分查找相似。就平均时间性能而言,二叉排序树上的查找和二分查找差不多。但二分查找的判定树唯一,而二叉排序树不唯一,相同的关键字其插入顺序不同可能生成不同的二叉排序树,如上图所示;就维护表的有序性而言,二叉排序树无须移动结点,只需修改指针即可完成插入和删除操作,平均执行时间为 。二分查找的对象是有序顺序表,若有插入和删除结点的操作,所花的代价是O(n)。当有序表是静态查找表时,宜用顺序表作为其存储结构,而采用二分查找实现其查找操作;若有序表是动态查找表,则应选择二又排序树作为其逻辑结构


总结

二叉排序树查找定义
二叉排序树构造
二叉排序树查找递归和非递归算法
二叉排序树插入递归和非递归算法
二叉排序树删除递归和非递归算法

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

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

相关文章

Qt的ui文件不能简单复制

在使用vsQt开发时&#xff0c;直接复制另外一个widget类的ui文件&#xff0c;简单改名成当前类对应的ui文件&#xff0c;会导致编译出错。尽可能使用添加的Qt class自带的ui文件&#xff0c;因为ui文件的配置文件中有许多与当前类相关的字符串&#xff0c;简单复制容易报错。

一年一度的中秋节马上又要到了,给你的浏览器也来点氛围感吧

说在前面 一年一度的中秋节马上又要到了&#xff0c;给你的浏览器也来点氛围感吧 &#x1f315;&#x1f315;&#x1f315; 插件设计 效果 首先我们应该要先确定一下我们想要实现的效果是怎样的&#xff0c;如上图&#xff0c;我们希望在页面上鼠标点击的时候会在点击区域随…

【送书活动】用“价值”的视角来看安全:《构建新型网络形态下的网络空间安全体系》

文章目录 每日一句正能量前言本书概况赠书活动目录 每日一句正能量 成功与失败&#xff0c;幸福与不幸&#xff0c;在各自心里的定义都不会相同。 前言 过去&#xff0c;安全从未如此复杂&#xff1b; 现在&#xff0c;安全从未如此重要&#xff1b; 未来&#xff0c;安全更需如…

Kasisto AI:金融对话人工智能

【产品介绍】​ 名称 Kasisto 成立时间​ Kasisto创立于2013年​。 具体描述 Kasisto 数字体验平台 KAI 为全渠道虚拟助理和聊天机器人提供支持&#xff0c;他们在移动应用程序、 网站、消息传递平台和支持语音的设备上精通银行业…

交换瓶子问题(暴力求解 + 图论解法)

交换瓶子问题 文章目录 交换瓶子问题前言题目描述暴力解法【能过】图论解法知识预备【交换环】 代码暴力做法和图论做法的对比总结 前言 知道题目用暴力算法是可以过的&#xff0c;注意数据范围是1~10000&#xff0c;卡在一个微妙的地方&#xff0c;不免让人想用暴力算法&…

PyTorch深度学习(一)【线性模型、梯度下降、随机梯度下降】

这个系列是实战&#xff08;刘二大人讲的pytorch&#xff09; 建议把代码copy下来放在编译器查看&#xff08;因为很多备注在注释里面&#xff09; 线性模型(Linear Model)&#xff1a; import numpy as npimport matplotlib.pyplot as plt #绘图的包​x_data [1.0, 2.0, …

Cesium 地球网格构造

Cesium 地球网格构造 Cesium原理篇&#xff1a;3最长的一帧之地形(2&#xff1a;高度图) HeightmapTessellator 用于从高程图像创建网格。提供了一个函数 computeVertices&#xff0c;可以根据高程图像创建顶点数组。 该函数的参数包括高程图像、高度数据的结构、网格宽高、…

Gradle的简介、下载、安装、配置及使用流程

Gradle的简介、下载、安装、配置及使用流程 1.Gradle的简介 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置&#xff0c;也增加了基于Kotlin语言的kotlin-based DSL&#xff0c;抛弃了基于X…

AI项目六:基于YOLOV5的CPU版本部署openvino

若该文为原创文章&#xff0c;转载请注明原文出处。 一、CPU版本DEMO测试 1、创建一个新的虚拟环境 conda create -n course_torch_openvino python3.8 2、激活环境 conda activate course_torch_openvino 3、安装pytorch cpu版本 pip install torch torchvision torchau…

vcruntime140_1.dll修复方法分享,教你安全靠谱的修复手段

在使用Windows操作系统的过程中&#xff0c;我们有时会遇到vcruntime140_1.dll文件丢失或损坏的情况。本文将详细介绍vcruntime140_1.dll的作用&#xff0c;以及多种解决方法和修复该文件时需要注意的问题&#xff0c;希望能帮助读者更好地处理这一问题。 一.vcruntime140_1.dl…

数据结构——【堆】

一、堆的相关概念 1.1、堆的概念 1、堆在逻辑上是一颗完全二叉树&#xff08;类似于一颗满二叉树只缺了右下角&#xff09;。 2、堆的实现利用的是数组&#xff0c;我们通常会利用动态数组来存放元素&#xff0c;这样可以快速拓容也不会很浪费空间&#xff0c;我们是将这颗完…

【Java】SpringData JPA快速上手,关联查询,JPQL语句书写

JPA框架 文章目录 JPA框架认识SpringData JPA使用JPA快速上手方法名称拼接自定义SQL关联查询JPQL自定义SQL语句 ​ 在我们之前编写的项目中&#xff0c;我们不难发现&#xff0c;实际上大部分的数据库交互操作&#xff0c;到最后都只会做一个事情&#xff0c;那就是把数据库中的…

电容 stm32

看到stm32电源部分都会和电容配套使用&#xff0c;所以对电容的作用产生了疑惑 电源 负电荷才能在导体内部自由移动&#xff0c;电池内部的化学能驱使着电源正电附近的电子移动向电源负极区域。 电容 将电容接上电池&#xff0c;电容的两端一段被抽走电子&#xff0c;一端蓄积…

【STL容器】vector

文章目录 前言vector1.1 vector的定义1.2 vector的迭代器1.3 vector的元素操作1.3.1 Member function1.3.2 capacity1.3.3 modify 1.4 vector的优缺点 前言 vector是STL的容器&#xff0c;它提供了动态数组的功能。 注&#xff1a;文章出现的代码并非STL库里的源码&#xff0c…

C++ PrimerPlus 复习 第三章 处理数据

第一章 命令编译链接文件 make文件 第二章 进入c 第三章 处理数据 文章目录 C变量的命名规则&#xff1b;C内置的整型——unsigned long、long、unsigned int、int、unsigned short、short、char、unsigned char、signed char和bool&#xff1b;如何知道自己计算机类型宽度获…

Jenkins Maven pom jar打包未拉取最新包解决办法,亲测可行

Jenkins Maven pom jar打包未拉取最新包解决办法&#xff0c;亲测可行 1. 发布新版的snapshots版本的jar包&#xff0c;默认Jenkins打包不拉取snapshots包2. 设置了snapshot拉取后&#xff0c;部分包还未更新&#xff0c;需要把包版本以snapshot结尾3. IDEA无法更新snapshots包…

超炫的开关效果

超炫的开关动画 代码如下 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>Switch</title><style>/* 谁家好人 一个按钮写三百多行样式代码 &#x1f622;&#x1f622;*/*,*:after,*:before {box-sizing: bor…

代码随想录--栈与队列-用队列实现栈

使用队列实现栈的下列操作&#xff1a; push(x) -- 元素 x 入栈pop() -- 移除栈顶元素top() -- 获取栈顶元素empty() -- 返回栈是否为空 &#xff08;这里要强调是单向队列&#xff09; 用两个队列que1和que2实现队列的功能&#xff0c;que2其实完全就是一个备份的作用 impo…

产教融合 | 力软联合重庆科技学院开展低代码应用开发培训

近日&#xff0c;力软与重庆科技学院联合推出了为期两周的低代码应用开发培训课程&#xff0c;来自重庆科技学院相关专业的近百名师生参加了此次培训。 融合研学与实践&#xff0c;方能成为当代数字英才。本次培训全程采用线下模式&#xff0c;以“力软低代码平台”为软件开发…

聚焦真实用例,重仓亚洲,孙宇晨畅谈全球加密新格局下的主动变革

「如果能全面监管&#xff0c;加密行业仍有非常大的增长空间。目前加密用户只有 1 亿左右&#xff0c;如果监管明朗&#xff0c;我们可以在 3-5 年内获得 20-30 亿用户。」—— 孙宇晨 9 月 14 日&#xff0c;波场 TRON 创始人、火币 HTX 全球顾问委员会成员孙宇晨受邀出席 20…