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

【数据结构笔记】搜索树

二叉搜索树

任一节点x的左/右子树中,所有非空节点均不大于(不小于)x

  • 必须是所有的非空节点,仅左右孩子不够(左孩子的右孩子可能很大)
  • 一棵二叉树是二叉搜索树当且仅当中序遍历序列是单调非降序列

两棵二叉搜索树等价当且仅当他们有相同的中序遍历序列(上下可变,左右不乱)

  • 换言之,构成两棵二叉搜索树的元素相同

等价变换zig、zag

  • zig:右单旋转
  • zag:左单旋转

变换后仍保持二叉搜索树的性质

(《算法导论》练习13.2-2)在任何一棵有n个结点的二叉搜索树中,恰有n-1种可能的旋转。

度为2的节点有2种转法,度为1的节点有1种转法,从而每种旋转对应一条边,共n-1条边。

(《算法导论》练习13.2-4)任何一棵含n个结点的二叉搜索树可以通过O(n)次旋转,转变为其他任何一棵含n个结点的二叉搜索树。

对于任何含n个结点的二叉搜索树,若某节点有左孩子,就右旋,如此会消除一个左孩子-父节点关系,而最多只有n-1个上述的左孩子-父节点关系,从而经至多n-1次旋转就能将其变为一条右链,而左右旋都是可逆的,转变只需要以该右链作为中介。

【2014-THU-Fin】由同一组共n个词条构成的任意两棵BST,经O(logn)次zig和zag旋转之后,必可相互转换。(×)

搜索

中序遍历操作

内部变量_hot指向搜索的终止位置的父节点

  • 如果命中,就是目标节点的父节点
  • 如果未命中,就是目标节点如果存在时的父节点

API返回搜索的终止位置

  • 如果命中,就是目标节点
  • 如果未命中,就是_hot的子哨兵节点

时间复杂度O(h)

插入

先搜索,让_hot指向将增加孩子的节点,再添加子节点

从插入的节点开始,向上更新节点高度

时间复杂度O(h)

删除

单子节点删除

直接把删除节点换成其以子唯一节点为根的子树

删除时利用搜索接口确定节点位置的过程给出当前_hot,它是向上更新节点高度的起点

双子节点删除

用在右子树中的直接后继替换删除节点,原来直接后继是度不为2的节点,化为单子节点删除

_hot设为原来直接后继的父节点,它是向上更新节点高度的起点

/******************************************************************************************
* BST节点删除算法:初除位置x所指癿节点(全局静态模板函数,适用亍AVL、Splay、RedBlack等各种BST)
* 目标x在此前经查找定位,并确认非NULL,故必删除成功;与searchIn不同,调用之前不必将hot置空
* 返回值指向实际被删除节点的接替者,hot指向实际被删除节点的父亲——二者均有可能是NULL
******************************************************************************************/
template <typename T>
static BinNodePosi(T) removeAt (BinNodePosi(T)& x, BinNodePosi(T)& hot) {BinNodePosi(T) w = x; //实际被摘除的节点,初值同xBinNodePosi(T) succ = NULL; //实际被删除节点的接替者if (!HasLChild(*x)) { //若*x的左子树为空,则可succ = x = x->rc; //直接将*x替换为其右子树}else if (!HasRChild(*x)){ //若右子树为空,则可succ = x = x->lc; //对称地处理——注意:此时succ != NULL}else { //若左右子树均存在,则选择x的直接后继作为实际被摘除节点,为此需要w = w->succ(); //(在右子树中)找到*x的直接后继*wswap(x->data, w->data); //交换*x和*w的数据元素BinNodePosi(T) u = w->parent;succ = w->rc; //w一定无左孩子,化为单节点的仅有右孩子情形((u == x) ? u->rc : u->lc) = succ;//如果u是x,即x是w的父节点,此时w在u的右子树中//若不然,因w是x的直接后继,此时w在u的左子树中}hot = w->parent; //记录实际被删除节点的父亲if (succ) {succ->parent = hot; //并将被删除节点的接替者与hot相联}release(w->data);release(w);return succ; //释放被摘除节点,返回接替者
} //release()负责释放复杂结构,与算法无直接关系,见代码包

 时间复杂度O(h)

平衡二叉搜索树

理想平衡树:n个节点,树高为⌊log_2n⌋的二叉树

适度平衡:n个节点,树高为渐进O(logn)的二叉树

  • 经过单次修改操作,最多只有O(logn)处不再满足适度平衡性条件
  • 可在O(logn)时间内,使这些不适度平衡处重新适度平衡

AVL树

节点v的平衡因子balFac(v) = height(lc(v)) - height(rc(v))

AVL条件:AVL树中所有节点满足|balFac(v)| <= 1

高度为h的AVL树至少含fib(h+3)-1个节点,进而n个节点的AVL树树高是O(logn)的。

【2012-THU-Fin】将[1481,1992]区间内的整数逐一插入到空AVL树中,最后该AVL树的高度是(CD)
A.7 
B.8 
C.9 
D.10 
E.以上都不对
共512=2^9个元素,至少为9。fib(13)-1=232,也可能是10。

失衡与重平衡

记UT(x)是因对节点x的操作而不满足AVL条件的节点集,下假设调整前UT(x)非空

插入失衡

UT(x)中的元素都是x的祖先,其不低于x的祖父节点,且可能一直失衡到根节点

重平衡自下而上逐个修正

右旋转

左旋转

左-右旋转

右-左旋转

  • 如果节点g的X孩子的Y子树插入导致的失衡
    • X=Y,在g做X旋转
    • X!=Y,先在X孩子做X旋转,再在g做Y旋转
  • 如果插入导致了旋转调整,那么本次插入不改变树高

每种旋转都是就地O(1)时间复杂度算法,每次将消除一个节点的失衡,而AVL树树高是O(logn)的,即最多O(logn)次旋转,时间复杂度共计O(logn)

删除失衡

UT(x)只有1个节点,但可能出现节点的替换(自下而上的失衡传播);任何进入UT(x)的节点失衡前后高度不变(要是失衡了,删除部分来自更低的部分,但高度取决于更高的子树)

删除导致的旋转调整不保证不改变树高,树高可能降低

时间复杂度O(logn)

“3+4”平衡重构

单次重构为就地O(1)时间复杂度算法(不计更新高度)

【2014-THU-Fin】设在某新节点插入AVL树后(尚待平衡化时),最低失衡节点为g。若此时g的左、右孩子的平衡因子分别为-1和0,则应通过(C)旋转使之重新恢复平衡。 
A.zig 
B.zig+zag 
C.zag+zig 
D.zag 
E.不确定 

【2016-THU-Fin】若AVL树插入元素的过程中发生了旋转操作,则树高必不变。(√)

【2016-THU-Fin】如果元素理想随机,那么对二叉搜索树做平衡化处理,对改进其渐进时间复杂度并没有什么实质的作用。(×)

伸展树

红黑树

B树

相关文章:

【数据结构笔记】搜索树

二叉搜索树 任一节点x的左/右子树中&#xff0c;所有非空节点均不大于&#xff08;不小于&#xff09;x 必须是所有的非空节点&#xff0c;仅左右孩子不够&#xff08;左孩子的右孩子可能很大&#xff09;一棵二叉树是二叉搜索树当且仅当中序遍历序列是单调非降序列 两棵二叉…...

如何使用UART(STM32 HAL库)

UART &#xff08;通用异步收发器&#xff09;是在 USART &#xff08;通用同步异步收发器&#xff09;基础上裁剪掉了同步通信功能&#xff0c;只剩下异步通信功能。关于通信和串口的基本知识&#xff0c;可参见文章《串口通信简介-CSDN博客》和《数据通信的一些基础概念-CSDN…...

星巴克英语

用流利的英文点星巴克 一杯咖啡 英文中文英文中文barista咖啡师coffee maker家用咖啡机cup sleeve杯套coffee stirrer咖啡棒coffee cup lid咖啡杯盖子straw吸管latte art咖啡拉花for here内用to go外带 例句&#xff1a; Could I have a cup sleeve for my coffee , please…...

权重衰减与暂退法——paddle部分

权重衰减与暂退法——paddle部分 本文部分为paddle框架以及部分理论分析&#xff0c;torch框架对应代码可见权重衰减与暂退法torch import paddle print("paddle version:",paddle.__version__)paddle version: 2.6.1当我们谈论机器学习模型的性能时&#xff0c;经…...

golang获取当天最小的时间,以DateTime的string格式返回

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

2025 - 中医学基础 - 考研 - 职称

2025 - 中医学基础 - 考研 - 职称 第1章 中医学导论 1.中医学的指导思想是&#xff08;&#xff09;( ) [单选] A&#xff0e;阴阳学说 B&#xff0e;五行学说 C&#xff0e;精气学说 D&#xff0e;整体观念 E&#xff0e;辨证论治 正确答案: D 2.中医学的理论核心是&…...

Pandas库

一、安装 Pandas是一个基于Python构建的专门进行数据操作和分析的开源软件库&#xff0c;它提供了高效的数据结构和丰富的数据操作工具。 安装 pip install pandas 二、核心数据结构 Pandas库中最常用的数据类型是Series和DataFrame&#xff1a; Series&#xff1a;一维数…...

Qt网络编程: 构建高效的HTTP文件下载器

文章目录 注意事项调用示例在使用Qt进行HTTP下载时,通常会使用QNetworkAccessManager类来管理HTTP请求和响应。这个类提供了进行网络请求的能力,包括下载文件。下面是使用Qt进行HTTP下载的一个示例,以及在实现时应考虑的一些注意事项。 注意事项 1.错误处理 始终检查QNetwo…...

Python 将Word, Excel, PDF和PPT文档转换为OFD格式

目录 使用工具 Python 将Word文档转换为OFD Python 将Excel文档转换为OFD Python 将PDF文档转换为OFD Python 将PPT文档转换为OFD OFD&#xff08;Open Fixed-layout Document&#xff09;是中国国家标准的电子文档格式&#xff0c;主要用于政府、金融等行业的正式文档传输…...

QD1-P21-P22 CSS 基础语法、注释、使用方法

本节学习&#xff1a;CSS 基础语法和注释&#xff0c;以及如何使用CSS定义的样式。 本节视频 https://www.bilibili.com/video/BV1n64y1U7oj?p21 CSS 基本语法 CSS&#xff08;层叠样式表&#xff09;的基本语法相对简单&#xff0c;由选择器和一组包含在花括号 {}​ 中的声…...

您是否也在寻找免费的 PDF 编辑器工具?10个备选PDF 编辑器工具

您是否也在寻找免费的 PDF 编辑器工具&#xff1f; 如果是&#xff0c;那么您在互联网上处于最佳位置&#xff01; 本指南中提到的所有 10 大免费 PDF 编辑器工具都易于使用&#xff0c;可以允许您添加文本、更改图像、添加图形、填写表格、添加签名等等。 因此&#xff0c;…...

C++调试方法(Vscode)(一) ——本地调试

初学者在调试一段代码的时候&#xff0c;经常出于不明原因&#xff0c;写出bug&#xff0c;导致程序崩溃。但是定位崩溃的地方时&#xff0c;往往采用简单而朴素的方法&#xff1a;即采用cout或者printf进行输出。这种方式既原始&#xff0c;又低效。一个合格的工程师应该是通过…...

C语言 | Leetcode C语言题解之第460题LFU缓存

题目&#xff1a; 题解&#xff1a; /* 数值链表的节点定义。 */ typedef struct ValueListNode_s {int key;int value;int counter;struct ValueListNode_s *prev;struct ValueListNode_s *next; } ValueListNode;/* 计数链表的节点定义。 其中&#xff0c;head是数值链表的头…...

【AI论文精读12】RAG论文综述2(微软亚研院 2409)P4-隐性事实查询L2

AI知识点总结&#xff1a;【AI知识点】 AI论文精读、项目、思考&#xff1a;【AI修炼之路】 P1&#xff0c;P2&#xff0c;P3 四、隐性事实查询&#xff08;L2&#xff09; 4.1 概述 ps&#xff1a;P2有四种查询&#xff08;L1&#xff0c;L2&#xff0c;L3&#xff0c;L4&…...

SpringBoot中间件Docker

Docker&#xff08;属于C/S架构软件&#xff09; 简介与概述 1.Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux …...

计算机毕设选题推荐【大数据专业】

计算机毕设选题推荐【大数据专业】 大数据专业的毕业设计需要结合数据的采集、存储、处理与分析等方面的技能。为帮助同学们找到一个适合且具有实践性的选题&#xff0c;我们为大家整理了50个精选的毕设选题。这些选题涵盖了大数据分析、处理技术、可视化等多个方向&#xff0…...

Bootstrap 4 多媒体对象

Bootstrap 4 多媒体对象 引言 Bootstrap 4 是目前最受欢迎的前端框架之一,它提供了一套丰富的工具和组件,帮助开发者快速构建响应式和移动设备优先的网页。在本文中,我们将重点探讨 Bootstrap 4 中的多媒体对象(Media Object)组件,这是一种用于构建复杂和灵活布局的强大…...

Springmvc Thymeleaf 标签

Thymeleaf是一个适用于Java的模板引擎&#xff0c;它允许开发者将动态内容嵌入到HTML页面中。在SpringMVC框架中&#xff0c;Thymeleaf可以作为一个视图解析器&#xff0c;使得开发者能够轻松地创建动态网页。以下是关于SpringMVC中Thymeleaf标签的详细介绍&#xff1a; 一、T…...

用java来编写web界面

一、ssm框架整体目录架构 二、编写后端代码 1、编写实体层代码 实体层代码就是你的对象 entity package com.cv.entity;public class Apple {private Integer id;private String name;private Integer quantity;private Integer price;private Integer categoryId;public…...

如何利用Fiddler进行抓包并自动化

首先一般使用Fiddler都是对手机模拟器进行抓包 接下来以MUMU模拟器为例 首先打开Fiddler-->tool-->options-->connection 将要打上的勾都打上&#xff0c;可以看到代理的端口是8888 打开HTTPS选项 把要打的勾打上&#xff0c;这样子才可以接收到HTTPS的包 MUMU打开…...

YOLOv10镜像作品集:高清图像目标检测惊艳案例分享

YOLOv10镜像作品集&#xff1a;高清图像目标检测惊艳案例分享 1. 引言&#xff1a;YOLOv10带来的视觉革命 在计算机视觉领域&#xff0c;目标检测技术正经历着前所未有的变革。YOLOv10作为最新一代的目标检测模型&#xff0c;以其无与伦比的速度和精度重新定义了实时检测的标…...

保姆级教程:用CST 2023的RLC求解器搞定空心电感仿真(附网格优化技巧)

从零到精通的CST空心电感仿真实战指南&#xff1a;RLC求解器与网格优化全解析 在电磁兼容设计和高频电路开发中&#xff0c;空心电感作为无磁芯干扰的理想元件&#xff0c;其精确建模一直是工程师的痛点。传统手工计算难以应对复杂的高频效应&#xff0c;而商业仿真软件的门槛…...

comsol的单相变压器绕组及铁芯振动形变仿真模型 1、单相变压器组振动形变模型:绕组在漏磁场...

comsol的单相变压器绕组及铁芯振动形变仿真模型 1、单相变压器组振动形变模型:绕组在漏磁场的洛伦兹力作用下振动&#xff0c;在长期作用下发生位移形变 2、单相变压器铁芯振动形变模型:铁芯在磁致伸缩作用下发生振动形变 注:时域仿真可以设置观察点&#xff0c;导出随时间变化…...

S2-Pro数据库课程设计助手:从需求分析到SQL生成的全程辅助

S2-Pro数据库课程设计助手&#xff1a;从需求分析到SQL生成的全程辅助 1. 课程设计的痛点与解决方案 每到学期末&#xff0c;数据库课程设计就成了计算机专业学生的"必修课"。面对一个陌生的业务场景&#xff0c;从零开始梳理需求、设计E-R图、编写SQL语句&#xf…...

抖音无水印下载完全指南:5分钟掌握批量下载核心技巧

抖音无水印下载完全指南&#xff1a;5分钟掌握批量下载核心技巧 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...

弦音墨影保姆级教程:解决‘视频加载失败’‘墨迹不跟随目标’等10类高频问题

弦音墨影保姆级教程&#xff1a;解决‘视频加载失败’‘墨迹不跟随目标’等10类高频问题 1. 系统简介与核心价值 「弦音墨影」是一款将人工智能技术与传统美学完美融合的视频分析工具。它采用水墨丹青的视觉风格&#xff0c;通过先进的Qwen2.5-VL多模态技术&#xff0c;让视频…...

Qwen3-ASR-1.7B快速上手:3分钟完成CSDN GPU实例Web界面识别体验

Qwen3-ASR-1.7B快速上手&#xff1a;3分钟完成CSDN GPU实例Web界面识别体验 想体验语音转文字的神奇效果&#xff1f;Qwen3-ASR-1.7B让你在3分钟内就能通过网页界面完成高质量语音识别&#xff0c;无需任何技术背景。 1. 什么是Qwen3-ASR-1.7B&#xff1f; Qwen3-ASR-1.7B是阿…...

NetCoreServer高级特性揭秘:自定义协议、会话管理和扩展机制

NetCoreServer高级特性揭秘&#xff1a;自定义协议、会话管理和扩展机制 【免费下载链接】NetCoreServer Ultra fast and low latency asynchronous socket server & client C# .NET Core library with support TCP, SSL, UDP, HTTP, HTTPS, WebSocket protocols and 10K c…...

抖音内容一键保存:3分钟搞定无水印批量下载完整指南

抖音内容一键保存&#xff1a;3分钟搞定无水印批量下载完整指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 你是不是也遇到过这样的烦恼&#xff1f;看到精彩的抖音视频想保存下来反复学习&#xff0c;却…...

数字一阶低通滤波器在嵌入式系统中的应用:从理论到代码实现(附MATLAB验证)

数字一阶低通滤波器在嵌入式系统中的工程实践&#xff1a;从参数设计到代码优化 在嵌入式系统开发中&#xff0c;信号处理是一个永恒的话题。无论是传感器数据采集、电机控制还是通信系统&#xff0c;原始信号往往混杂着各种噪声。数字一阶低通滤波器以其计算量小、实现简单的特…...