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

2023-09-15 18:42:55


前言

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


一、二叉排序树

  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)。当有序表是静态查找表时,宜用顺序表作为其存储结构,而采用二分查找实现其查找操作;若有序表是动态查找表,则应选择二又排序树作为其逻辑结构


总结

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

更多推荐

50行Python代码实现代理服务器的详细教程

代理服务器是一种位于客户端与目标服务器之间的中间服务器,它可以代表客户端发送请求,并将响应返回给客户端。通过搭建自己的代理服务器,我们可以实现请求的拦截、修改和转发等功能。本文将为大家介绍如何使用50行Python代码实现代理服务器。一、准备工作在开始之前,我们需要确保已经安装了以下库:socket:用于创建套接字和网

Canal 实现MySQL与Elasticsearch7数据同步

1工作原理canal模拟MySQLslave的交互协议,伪装自己为MySQLslave,向MySQLmaster发送dump协议MySQLmaster收到dump请求,开始推送binarylog给slave(即canal)canal解析binarylog对象(原始为byte流)优点:可以完全和业务代码解耦,增量日志订阅

百度APP iOS端包体积50M优化实践(六)无用方法清理

一、前言百度APP包体积经过一期优化,如无用资源清理,无用类下线,Xcode编译相关优化,体积已经有了明显的减少。但是优化后APP包体积在iPhone11上仍有350M的空间占用。与此同时百度APP作为百度的旗舰APP,业务迭代非常多且迅速,体积优化和防劣化仍然是当前阶段的一个核心任务。因此百度APP开启了粒度更小,修

php生成二维码合成文字、背景图并保存本地图片

目录1、实现效果,二维码二维码合成文字、背景图2、下载并引入qrcode3、创建static文件夹下载字体和背景图到这4、创建test2.php,合成代码1、实现效果,二维码二维码合成文字、背景图2、下载并引入qrcode1、到phpqrcpde官网下载类库,官网地址:http://phpqrcode.sourcefo

【错误记录】IntelliJ IDEA 打包包含依赖库的 Jar 包执行报错 ( Invalid signature file digest for Manifest main attribute )

文章目录一、报错信息二、解决方案博客总结:核心报错信息如下:Error:AJNIerrorhasoccurred,pleasecheckyourinstallationandtryagainExceptioninthread“main”java.lang.SecurityException:Invalidsignatu

mmap使用测试

mmap使用测试Linux系统调用mmap()api说明,这个系统函数在频繁读写文件是很高效。mmap在调用进程内开辟一块内存空间,将文件(或文件部分)内容映射到调用的进程的虚拟空间中。进程通过操作这块mmap开辟的虚拟内存,就相当于直接操作文件本身了,其余的细节都由kernel,cpu中的mcu负责完成。这样与传统的

【LeetCode每日一题】——面试题10.11.峰与谷

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】一【题目类别】排序二【题目难度】中等三【题目编号】面试题10.11.峰与谷四【题目描述】在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整

io概述及其分类

一、IO概念•I/O即输入Input/输出Output的缩写,其实就是计算机调度把各个存储中(包括内存和外部存储)的数据写入写出的过程;I:InputO:Output通过IO可以完成硬盘文件的读和写。•java中用“流(stream)”来抽象表示这么一个写入写出的功能,封装成一个“类”,都放在http://java.i

PyTorch深度学习实战(13)——可视化神经网络中间层输出

PyTorch深度学习实战(13)——可视化神经网络中间层输出0.前言1.可视化特征学习的结果2.可视化第一个卷积层的输出3.可视化不同网络层的特征图小结系列链接0.前言随着深度学习的快速发展,神经网络已成为解决各种复杂任务的重要工具。然而,神经网络的黑盒特性使得我们对其内部运作过程和学到的表示仍然不够了解。为了更好地

spring并发读写数据库

spring并发读写数据库多线程写入数据库,事物通过AOP控制,无需影响业务代码存在几个小问题还不太理解有大佬看懂了麻烦点拨一下有好的优化代码思路欢迎交流代码当前仓库不能公开,代码下载文章目录spring并发读写数据库待解决问题基础实现原理单独任务实现通过AOP抽离事物控制的代码待解决问题//如果executor出现问

如何优化网站排名(百度SEO指南与优化布局方法)

百度SEO指南介绍:蘑菇号-www.mooogu.cn首先,为了提高网站的搜索引擎优化排名,需要遵循百度SEO指南的规则和标准。这包括使用符合规范的网站结构、页面内容的质量和与目标用户相关的关键词。避免使用非法技术和黑帽SEO的方法。增加百度SEO外链的四个步骤:第一步是寻找优质外链,例如与行业相关的网站、新闻媒体和知

热文推荐