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

数据结构—树表的查找

7.3树表的查找

​ 当表插入、删除操作频繁时,为维护表的有序表,需要移动表中很多记录。

​ 改用动态查找表——几种特殊的树

​ 表结构在查找过程中动态生成

​ 对于给定值key

​ 若表中存在,则成功返回;

​ 否则,插入关键字等于key的记录

7.3.1二叉排序树

二叉排序树(Binary Sort Tree)又称为二叉搜索树、二叉查找树。

定义:

二叉排序树或是空树,或是满足如下性质的二叉树:(1)若其左子树非空,则左子树上所有结点的值均小于根结点的值;(2)若其右子树非空,则右子树上所有结点的值均大于等于根结点的值;(3)其左右子树本身又各是一棵二叉树

#图解 数据结构:二叉排序树 - 知乎

二叉排序树的性质

​ 中序遍历非空的二叉排序树所得的数据元素序列时一个按关键字排序的递增有序序列。

二叉排序树的存储结构

typedef struct{KeyType key;//关键字项InfoType otherinfo;//其他数据域
}ElemType;
typedef struct BSTNode{ElemType data;//数据域struct BSTNode *lchild,*rchild;//左右孩子指针
}BSTree T;
BSTree T;//定义二叉排序树

查找

  • 若查找的关键字等于根结点,成功
  • 否则
    • 若小于根结点,查其左子树
    • 若大于根结点,查其右子树
  • 在左右子树上的操作类似
1、二叉排序树的递归查找

【算法思想】

  1. 若二叉排序树为空,则查找失败,返回空指针。
  2. 若二叉排序树非空,将给定值key与根结点的关键字T->data.key进行比较:
    • 若key等于T->data.key,则查找成功,返回根结点地址;
    • 若key小于T->data.key,则进一步查找左子树;
    • 若key大于T->data.key,则进一步查找左子树。
BSTree SerachBT(BSTree T,KeyType key){if((!T)||key==T->data.key) return T;else if(key<T->data.key)return SearchBST(T->lchild,key);//在左子树中继续查找else return SearchBST(T->rchild,key);//在右子树中继续查找
}

二叉排序树的查找分析

​ 二叉排序树上查找某关键字等于给定值的结点过程,其实就是走了一条从根到该结点的路径。

比较的关键字次数=此结点所在层次数

最多的比较次数=数的深度

问题:如何提高形态不均衡的二叉排序树的查找效率?

解决办法:做“平衡化”处理,即尽量让二叉树的形状均衡!

2、二叉排序树的插入
  • 若二叉排序树为空,则插入结点作为根结点插入到空树中
  • 否则,继续在其左、右子树上查找
    • 树中已有,不再插入
    • 树中没有
      • 查找直至某个叶子结点的左子树或右子树为空为止,则插入结点应为该叶子结点的左孩子或右孩子。

插入的元素一定在叶节点上

3、二叉排序树的删除

​ 从二叉排序树中删除一个结点,不能把以该结点为根的子树都删去,只能删掉该结点,并且还应保证删除后所得的二叉树仍然满足二叉排序树的性质不变。

​ 由于中序遍历二叉排序树可以得到一个递增有序的序列。那么,在二叉排序树删去一个结点相当于删去有序序列中的一个结点。

  • 将因删除结点而断开的二叉链表重新链接起来
  • 防止重新链接后树的高度增加

img

数据结构(34)二叉排序树__李白_的博客-CSDN博客_数据结构中什么是二叉排序树

4、二叉排序树的生成

​ 从空树出发,经过一系列的查找、插入操作之后,可生成一棵二叉排序树。

数据结构之二叉排序树(C语言实现)_kang___xi的博客-CSDN博客_二叉排序树的实现

​ 一个无序序列可通过构造二叉排序树而变成一个有序序列。构造树的过程就是对无序序列进行排序的过程。

​ 插入的结点均为叶子结点,故无序移动其他结点。相当于在有序序列上插入记录而无需移动其他记录。

关键字的输入顺序不同,建立的二叉排序树不同

img

7.3.2平衡二叉树

1.平衡二叉树的定义

平衡二叉树(balance binary tree)

  • 又称AVL树

  • 一棵平衡二叉树或者是空树,或者是具有下列性质的二叉排序树:

    • 左子树与右子树的高度之差的绝对值小于等于1;
    • 左子树和右子树也是平衡二叉排序树。

    为了方便起见,给每个结点附加一个数字,给出该结点左子树与右子树的高度差。这个数字称为结点的平衡因子(BF)。

    平衡因子 = 结点左子树的高度 - 结点右子树的高度

    根据平衡二叉树的定义,平衡二叉树上所有结点的平衡因子只能是-1、0或1。

    详解平衡二叉树(AVL树)以及Python实现相关操作_珞沫的博客-CSDN博客_平衡二叉树的实现和常见操作

2.失衡二叉排序树的分析与调整

​ 当我们在一个平衡二叉排序树上插入一个结点时,有可能导致失衡,即出现平衡因子绝对值大于1的结点,如:2、-2。

​ 如果在一棵AVL树中插入一个新结点后造成失衡,则必须重新调整树的结果,使之恢复平衡。

相关文章:

数据结构—树表的查找

7.3树表的查找 ​ 当表插入、删除操作频繁时&#xff0c;为维护表的有序表&#xff0c;需要移动表中很多记录。 ​ 改用动态查找表——几种特殊的树 ​ 表结构在查找过程中动态生成 ​ 对于给定值key ​ 若表中存在&#xff0c;则成功返回&#xff1b; ​ 否则&#xff0…...

微信小程序测试策略和注意事项?

一、测试前准备&#xff08;环境搭建&#xff09; 1、前端页面 微信 Web 开发者工具安装、授权测试用的微信号可预览和调试小程序 2、管理后台 配置内网测试服务器环境&#xff0c;通过 PC 端 Web 站点管理小程序前端的输出内容&#xff0c;可从开发人员获取管理账号进行测…...

VUE3封装EL-ELEMENT-PLUS input组件

VUE3封装EL-ELEMENT-PLUS input组件 完整代码 <template><div><div><div class"lable_top" v-if"label"><label :class"lable_sty">{{ label }}</label></div><el-inputv-model"inputValue&…...

RISC-V公测平台发布 · 在SG2042上配置Jupiter+Octave科学计算环境

简介 JupyterHub是一个开源的共享计算平台&#xff0c;它为每个用户管理一个单独的 Jupyter 环境&#xff0c; 可以用于学生班级、企业数据科学小组或科学研究小组。它是一个多用户中心&#xff0c;可以生成、管理和代理多个单用户Jupyter笔记本服务器的实例。 GNU Octave是一…...

初识Sentinel

目录 1.解决雪崩的方式有4种&#xff1a; 1.1.2超时处理&#xff1a; 1.1.3仓壁模式 1.1.4.断路器 1.1.5.限流 1.1.6.总结 1.2.服务保护技术对比 1.3.Sentinel介绍和安装 1.3.1.初识Sentinel 1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制 2.1.簇点链路 …...

【官方中文文档】Mybatis-Spring #注入映射器

注入映射器 与其在数据访问对象&#xff08;DAO&#xff09;中手工编写使用 SqlSessionDaoSupport 或 SqlSessionTemplate 的代码&#xff0c;还不如让 Mybatis-Spring 为你创建一个线程安全的映射器&#xff0c;这样你就可以直接注入到其它的 bean 中了&#xff1a; <bea…...

UG\NX 二次开发 相切面、相邻面的选择控件

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 有群友问“UFUN多选功能过滤面不能选择相切面或相邻面之类的吗?” 这个用Block UI的"面收集器"就可以,ufun函数是不行的。 效果: C++语言在UG二次开发中的应用及综合分析 C++ …...

Quartz任务调度框架介绍和使用

一、Quartz介绍 Quartz [kwɔːts] 是OpenSymphony开源组织在Job scheduling领域又一个开源项目&#xff0c;完全由Java开发&#xff0c;可以用来执行定时任务&#xff0c;类似于java.util.Timer。但是相较于Timer&#xff0c; Quartz增加了很多功能&#xff1a; 1.持久性作业 …...

drools8尝试

drools7升级到drools8有很大很大的变更.几乎不能说是一个项目了. 或者说就是名字相同的不同项目, 初看下来变化是这样 两个最关键的东西都retired了 https://docs.drools.org/8.42.0.Final/drools-docs/drools/migration-guide/index.html business central变成了一个VS code…...

【机器学习】python基础实现线性回归

手写梯度下降的实现ykxb的线性回归 算法步骤&#xff1a; &#xff08;1&#xff09;构造数据&#xff0c;y3*x5; &#xff08;2&#xff09;随机初始化和&#xff0c;任意数值&#xff0c;例如9,10; &#xff08;3&#xff09;计算&#xff0c;,并计算 &#xff08;4&…...

vue table合并行 动态列名

需求: 1.合并行,相同数据合并 2,根据后端返回数据动态显示列名, 我这个业务需求是,每年增加一列,也就是列名不是固定的,后端返回数据每年会多一条数据,根据返回数据显示列名 实现: html <el-table v-loading"loading" :data"dataList" :span-metho…...

Spring Cloud Alibaba-Nacos Discovery--服务治理

1 服务治理介绍 先来思考一个问题 通过上一章的操作&#xff0c;我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址 &#xff08;ip&#xff0c;端口&#xff09;等硬编码到了代码中&#xff0c;这种做法存在许多问题&#xff1a; 一旦服务提供者地址变化&am…...

【C++】unordered_map和unordered_set的使用 及 OJ练习

文章目录 前言1. unordered系列关联式容器2. map、set系列容器和unordered_map、unordered_set系列容器的区别3. unordered_map和unordered_set的使用4. set与unordered_set性能对比5. OJ练习5.1 在长度 2N 的数组中找出重复 N 次的元素思路分析AC代码 5.2 两个数组的交集思路分…...

初识 JVM 01

JVM JRE JDK的关系 JVM 的内存机构 程序计数器 java指令的执行流程&#xff1a; 1 右侧的java源代码编译为左侧的java字节码&#xff08;右侧第一个方块对应左侧第一个方块&#xff09; 2 字节码 经过解释器 变为机器码 3 机器码就可以被cpu来执行 程序计数器的作用就…...

FPGA应用学习笔记----I2S和总结

时序一致在慢时序方便得多 增加了时序分布和分析的复杂性 使用fifo会开销大量资源...

归并排序之从微观看递归

前言 这次&#xff0c;并不是具体讨论归并排序算法&#xff0c;而是利用归并排序算法&#xff0c;探讨一下递归。归并排序的特点在于连续使用了两次递归调用&#xff0c;这次我们将从微观上观察递归全过程&#xff0c;从本质上理解递归&#xff0c;如果能看完&#xff0c;你一…...

Pytorch-day07-模型保存与读取

PyTorch 模型保存&读取 模型存储模型单卡存储&多卡存储模型单卡读取&多卡读取 1、模型存储 PyTorch存储模型主要采用pkl&#xff0c;pt&#xff0c;pth三种格式,就使用层面来说没有区别PyTorch模型主要包含两个部分&#xff1a;模型结构和权重。其中模型是继承n…...

【C语言每日一题】01. Hello, World!

题目来源&#xff1a;http://noi.openjudge.cn/ch0101/01/ 01. Hello, World! 总时间限制: 1000ms 内存限制: 65536kB 问题描述 对于大部分编程语言来说&#xff0c;编写一个能够输出“Hello, World!”的程序往往是最基本、最简单的。因此&#xff0c;这个程序常常作为一个初…...

arm: day8

1.中断实验&#xff1a;按键控制led灯 流程&#xff1a; key.h /*************************************************************************> File Name: include/key.h> Created Time: 2023年08月21日 星期一 17时03分20秒***************************************…...

k8s容器加入host解析字段

一、通过edit或path来修改 kubectl edit deploy /xxxxx. x-n cattle-system xxxxx为你的资源对象名称 二、添加字段 三、code hostAliases:- hostnames:- www.rancher.localip: 10.10.2.180...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...