c++ - 第17节 - AVL树和红黑树

news2024/11/30 2:44:56

1.AVL树

1.1.AVL树的概念

二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。

一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:

\bullet 它的左右子树都是AVL树  

\bullet 左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)

如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有n个结点,其高度可保持在

log_{2}^{N},搜索时间复杂度O(log_{2}^{N})

下面四棵树,一二三是AVL树,每个结点都满足其左右子树高度差的绝对值不超过1,四不是AVL树,因为其3结点的左子树高度是2,右子树高度是0,高度差的绝对值为2

可以看出,相比满二叉树,完全二叉树最后一层会缺一些结点,而AVL树最后两层会缺一些结点。

1.2.AVL树节点的定义

AVL树节点的定义:

template<class K, class V>
struct AVLTreeNode
{
	pair<K, V> _kv;
	AVLTreeNode<K, V>* _left;
	AVLTreeNode<K, V>* _right;
	AVLTreeNode<K, V>* _parent;

	// 右子树-左子树的高度差
	int _bf;  // balance factor
};

注:

1.AVL树使用三叉链,每个树结点中使用_parent成员变量保存其父节点的地址。

2.树节点中有一个_bf成员变量,该成员变量是balance factor的缩写,记录该节点右子树-左子树的高度差。AVL树并没有规定必须要设计平衡因子,这里使用平衡因子只是一个实现的选择,方便控制平衡。

1.3.AVL树的插入

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

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

相关文章

Mybatis:MyBatis的逆向工程(10)

Mybaits笔记框架&#xff1a;https://blog.csdn.net/qq_43751200/article/details/128154837 Mybatis中文官方文档&#xff1a; https://mybatis.org/mybatis-3/zh/index.html Mybati的逆向工程1. 正向工程 VS 逆向工程2. 创建逆向工程的步骤&#xff08;MyBatis3Simple清新简洁…

Go 1.20要来了,看看都有哪些变化-第1篇

前言 Go官方团队在2022.12.08发布了Go 1.20 rc1(release candidate)版本&#xff0c;Go 1.20的正式release版本预计会在2023年2月份发布。 让我们先睹为快&#xff0c;看看Go 1.20给我们带来了哪些变化。(文末有彩蛋&#xff01;) 安装方法&#xff1a; $ go install golan…

[附源码]Nodejs计算机毕业设计基于web的火车订票管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

阅读器消退之际:文石造产品,掌阅塑生态

配图来自Canva可画 阅读器正在变得小众&#xff0c;似乎自Kindle以来营造的那种“阅读的生活方式”&#xff0c;已经被证明是一个伪命题&#xff1a;会阅读的人&#xff0c;无论如何都会去阅读&#xff1b;不会阅读的人&#xff0c;阅读器的归宿终究是一个“泡面盖”。于是&am…

Android原生项目接入flutter_boost4.0

折腾了好几天&#xff0c;经验思维导致的&#xff0c;记录一下踩坑。 官方接入步骤官方文档 接入原生&#xff0c;就3个步骤&#xff0c;我都能折腾好久&#xff0c;浪费时间。 flutter部分很简单&#xff0c;按文档配置就行&#xff0c;在pubspec.yaml依赖就好了。 &#…

Ceph性能瓶颈分析与优化(混合盘篇)

原文链接: Ceph性能瓶颈分析与优化(混合盘篇) - 知乎背景ssdhdd的混合盘场景在各个存储厂商中算是一种典型应用场景。 但是经过测试(4k随机写)发现&#xff0c;加了nvme ssd做ceph的wal和db后&#xff0c;性能提升仅一倍以内且nvme盘性能余量较大。所以希望通过对问题瓶颈进行…

目标检测数据标注案例-高清地图中障碍物(汽车)标注

计算机视觉在无人机中领域中有何作用? 无人机能够在空中识别、分类和追踪目标。无人机的摄像头和感应器可以捕获数据并进行分析&#xff0c;以提取重要信息。 AI可以自动提取视觉数据信息&#xff0c;准确识别、说明和追踪图像和视频中的目标。例如高空检测工作&#xff0c;…

Nacos 配置中心之长轮询--客户端

先来看下长轮询调用的链路 客户端 入口 在 NacosConfigService 初始化的时候,会初始化两个组件 一是网络组件,也就是http数据处理的 (起作用的是 ServerHttpAgent)二是客户端的长轮询ClientWorker public NacosConfigService(Properties properties) throws NacosException…

本地连接docker mysql

1.拉取镜像 docker pull mysql 2.启动mysql实例容器 docker run --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORDmysql_pw -d mysql --name 为mysql的实例设置别名。 -p 3307为对外暴露的端口。3306是内部端口 -e MYSQL_ROOT_PASSWORD 设置mysql登录密码 -d 以守…

1.41.5 模型评估和选择,正则化和交叉验证

1.4&1.5 模型评估和选择&#xff0c;正则化和交叉验证模型评估和选择训练误差和测试误差过拟合正则化与交叉验证正则化交叉验证模型评估和选择 训练误差和测试误差 将预测系统的X作为输入&#xff0c;输入到模型里面&#xff0c;就可以得到预测结果。 学习到的模型&…

UNIX网络编程卷一 学习笔记 第五章 TCP客户/服务器程序示例

本章将编写一个完整的TCP客户/服务器程序&#xff0c;这个简单例子是执行以下步骤的一个回射服务器&#xff1a; 1.客户从标准输入读入一行文本&#xff0c;并写给服务器&#xff1b; 2.服务器从网络输入读入这行文本&#xff0c;并回射给客户&#xff1b; 3.客户从网络输入读入…

Spring Ioc 依赖来源-7

1. 依赖查找的来源&#xff1a;除容器内建和自定义Spring Bean之外&#xff0c;还有其他来源提供依赖查找吗&#xff1f; 查找来源 Spring 內建 BeanDefintion Spring 內建单例对象 当spring在注解环境下面, 这个 registerAnnotationConfigProcessors API会被调用, 它会被…

Xilinx Vivado的RTL分析(RTL analysis)、综合(synthesis)和实现(implementation)的区别?

1、一般流程 Xilinx 的开发工具Vivado其实还是比较好上手的&#xff0c;在左边的设计流程导航已经把FPGA的开发过程按先后顺序给排列出来了&#xff1a; Project Manager&#xff1a;项目管理器&#xff0c;此项是对项目的参数进行设置 IP Integrator&#xff1a;IP集成器&…

广域铭岛参编《数智化供应链参考架构》标准正式发布

近日&#xff0c;广域铭岛参编的《数智化供应链参考架构》标准正式发布。该标准由工业互联网产业联盟&#xff08;以下简称“联盟/AII”&#xff09;发布&#xff0c;是国内首个数智化供应链领域的参考架构标准&#xff0c;明确了新兴的数字化和智能化技术如何在供应链领域应用…

大数据进程管理

进程管理 查看进程 进程查看命令 ps la | head -5&#xff0c;能够观察所有系统的数据 ps axjf | head -20&#xff0c;连同部分程序树状态 ps l仅查看自己的bash相关的进程 ps aux观察系统所有进程 属性含义USER进程使用者PID进程标识符%CPU进程使用掉的CPU 资源百分比%MEM…

一个不错的docker支持音频的rdp桌面

docker pull danielguerra/xfce4-rdp-audio 获取该镜像后&#xff0c;运行 docker run -d --name xfce4_0 --shm-size 1g -p 3389:3389 danielguerra/xfce4-rdp-audio相当于开了3个不同的系统容器&#xff0c;端口分别的13389,23389,33389&#xff0c;这时用远程桌面就可以连…

记录--记一次前端CSS升级

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 目前平台前端使用的是原生CSSBEM命名&#xff0c;在多人协作的模式下&#xff0c;容易出现样式冲突。为了减少这一类的问题&#xff0c;提升研效&#xff0c;我调研了业界上主流的7种CSS解决方案&…

Java基于springboot+vue 的传统乐器培训管理系统 elementUI

此网站系统的开发方式和信息管理方式&#xff0c;借鉴前人设计的信息和研发。以在线乐器培训管理为主&#xff0c;以乐器培训管理为核心功能来进行设计和研发&#xff0c;把网站信息和技术整合&#xff0c;开发出一套网上乐器培训管理系统。主要运用现在社会公司中最新的技术框…

rocketmq源码学习-nameServer

前言 最近看了下rocketmq的源码&#xff0c;计划针对最近的学习&#xff0c;做一个笔记&#xff0c;先从nameServer启动的逻辑开始记录吧 在rocketmq中&#xff0c;有四个关键的组件 nameServerbrokerproducerconsumer 这四个组件之间的关系是这样的 关于nameSrv namese…

[附源码]Python计算机毕业设计钓鱼爱好者交流平台Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…