【数据结构】二叉树、二叉搜索树、平衡二叉树、红黑树、B树、B+树

概述

二叉树(Binary Tree):每个节点最多有两个子节点(左子节点和右子节点),没有限制节点的顺序。特点是简单直观,易于实现,但查找效率较低。

二叉搜索树(Binary Search Tree,BST):在二叉树的基础上,左子节点的值小于等于父节点的值,右子节点的值大于等于父节点的值。特点是插入、删除和查找的平均时间复杂度为O(log n),但如果树不平衡,可能会退化为链表,时间复杂度为O(n)。

平衡二叉树(Balanced Binary Tree):在二叉搜索树的基础上,保持树的平衡,即左右子树的高度差不超过1。常见的平衡二叉树有AVL树和红黑树。特点是插入、删除和查找的时间复杂度为O(log n),但维护平衡的代价较高。

红黑树(Red-Black Tree):是一种自平衡的二叉搜索树,通过对节点进行着色和旋转操作来保持树的平衡。特点是插入、删除和查找的时间复杂度为O(log n),并且对于任意节点,从根节点到达该节点的路径长度相等。

B树(B-Tree):一种多路搜索树,每个节点可以有多个子节点。特点是适合存储在磁盘或其他外部存储设备上的大量数据,可以减少磁盘I/O操作的次数。

B+树(B+ Tree):在B树的基础上进行了优化,非叶子节点只存储索引信息,所有叶子节点通过指针连接形成链表。特点是适合范围查询和排序,常用于数据库索引。

详解

结构特点:树的节点数目、子节点数目、节点之间的关系等。

平衡性:是否能够保持树的平衡,即节点的左右子树高度差是否有限制。

插入、删除和查找的时间复杂度:不同树对这些操作的时间复杂度不同,影响了树的使用场景。

存储和访问方式:不同树的存储方式和访问方式有所不同,适用于不同的应用场景。

二叉树(Binary Tree)

只是看起来是个树,乱序,查找数据得一个一个的找,所以没啥用。

二叉搜索树(Binary Search Tree,BST)

有序的,查找比二叉树要快,如图,找0005的话,从根节点开始,只需要寻找3次就能找到

 但如果是这样的,那就得找5次,这就退化成了链表

平衡二叉树(Balanced Binary Tree)

为解决退化问题,在二叉搜索树的基础上,通过旋转来保持平衡,使左右子树的高度差不超过1。

旋转方式

先看下每个节点里有什么

1、节点值:每个节点都包含一个值,用于存储数据。
2、左子树指针:指向节点的左子树的指针。
3、右子树指针:指向节点的右子树的指针。
4、父节点指针:指向节点的父节点的指针。这个参数在某些实现中可能会被省略。
5、平衡因子:平衡因子是用于判断节点平衡状态的指标,它是指一个节点的左子树高度减去右子树高度的差值。平衡因子可以为-1、0或1,分别代表左子树高度比右子树高度小1、相等或大1。

情况与旋转方式

LL(左-左)情况:0004作为根节点,右旋操作

RR(右-右)情况:0004作为根节点,左旋操作。

LR(左-右)情况:0003和0004交换,得到LL(左-左)情况。

RL(右-左)情况:0004和0005交换,得到RR(右-右)情况。

旋转前 

 

 

旋转后

下面这种情况,同时满足LL、LR,用两种选择方式来选择都是可以的,默认是LL。(RR、RL同理,默认RR)。

        当作LL情况时, 先无视0004,旋转后,再把0004插入。

        当作LR情况时,先无视0002,旋转后,再把0002插入。

旋转前

 

旋转后

由于绝对平衡,要求过于严苛,当数据庞大的时候,需要消耗大量的资源进行旋转来保持平衡。

红黑树(Red-Black Tree)

红黑树是一种自平衡的二叉查找树,具有以下特点:

  1. 节点是红色或黑色:每个节点要么是红色,要么是黑色。

  2. 根节点是黑色:根节点始终是黑色的。

  3. 叶子节点(NIL节点,空节点)是黑色:叶子节点是特殊的空节点,它们被认为是黑色的。

  4. 红色节点的子节点都是黑色的:红色节点不能连续出现,即红色节点的父节点和子节点都是黑色的。

  5. 从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点:这个特性保证了红黑树的平衡性,即任意两个叶子节点的路径长度相等。

自平衡:满足红黑树的条件即可、无需像平衡二叉树那样高度差绝对值必须小于等于1。红黑树的自平衡操作主要包括左旋、右旋和颜色翻转三种操作,在插入或删除一个节点时,红黑树最多需要进行3次旋转即可达到平衡。

红黑树旋转 

参照:红黑树最多三次旋转达到平衡 - 简书 (jianshu.com)

B树(B-Tree)

相比于二叉搜索树,B树的每个节点可以存储更多的键和值。数据直接存储在节点上。

B+树(B+ Tree)

相比于B树,B+树内部节点上只存储键,具体数据存到叶子节点上。

在线演示工具
二叉搜索树:https://www.cs.usfca.edu/~galles/visualization/BST.html
平衡二叉树:https://www.cs.usfca.edu/~galles/visualization/AVLtree.html
红黑树:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
B树:https://www.cs.usfca.edu/~galles/visualization/BTree.html
B+树:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

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

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

相关文章

烘焙小程序蛋糕店烘焙店源码点心店小程序源码

本系统开发使用JAVA技术栈开发 使用uniapp技术栈 支持微信小程序 ,对接打印机,对接第三方同城跑腿平台 用户端使用:uniapp 管理端使用:vueelementui 后台服务使用:springbootjpa

Java版本工程行业管理系统源码-专业的工程管理软件-提供一站式服务 em

​ 工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

不同语言操作符的优先级

看到标题,可能会心生疑惑: 这么基础且重要的操作,不同语言不应该是一致的吗? 并不一定,比如对于右移运算和加法运算,Go就与其他多数语言表现得不一致: Go: package mainimport "fmt"func main() …

Vault数据备份恢复-MySQL

前言 Vault提供了可靠的功能来保护数据库和其他关键数据。 对于MySQL数据库,Vault提供了一个易于使用的解决方案,可以自动创建和管理定期备份,并支持从备份中快速恢复数据。本文将介绍Vault后端存储MySQL的备份恢复,包括如何设置Vault、如何进行数据备份和还原、如何保护…

iOS——Block two

Block 的实质究竟是什么呢?类型?变量?还是什么黑科技? Blocks 是 带有局部变量的匿名函数 Blocks 由 OC 转 C 源码方法 在项目中添加 blocks.m 文件,并写好 block 的相关代码。打开「终端」,执行 cd XX…

[C++]01.基础,数据类型,运算符

01.基础,数据类型,运算符 一.C基础入门1.HelloWorld2.注释3.变量4.常量5.关键字6.命名规则 二.数据类型1.整形2.sizeof关键字3.浮点型4.字符型5.转义字符6.字符串型7.布尔类型8.数据的输入 三.运算符1.算数运算符2.赋值运算符3.比较运算符4.逻辑运算符 一.C基础入门 1.HelloWo…

webshell详解

Webshell详解 一、 Webshell 介绍二 、 基础常见webshell案例 一、 Webshell 介绍 概念 webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与…

【普通人维护windows的方法,不中毒,不弹窗,不卡顿】

前言 IT人也是普通人,我就说说普通人维护电脑的方法。 我的电脑配置 给大家看看,配置一般,运行软件和游戏,可以保持基本流程 日常维护措施 我不太喜欢设定一些非主流的配置,下了一个360卫士,360其他的套餐可以不用下…

数据结构——绪论

一、绪论 (一)基本概念 数据:数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 数据元素:数据元素是数据的基本单位,在计算机程序中通常作为一个整…

js实现按照句号将一段文本进行分段

/*** 将给定的文本按照300字并且按照句号分为多个p标签** param text 给定的文本* returns 返回分割后的多个p标签的数组*/ function splitTextByParagraph(text) {// 将文本按照句号分割成多个句子const sentences text.split(。);// 初始化一个空数组来存储生成的p标签const…

Nodejs中的全局对象

今天我们将探讨Nodejs中的全局对象,这是Nodejs中重要且有趣的知识点。我们将通过生动形象的例子和风趣的风格来深入理解这些概念,并比较Nodejs中的全局对象与前端JavaScript中的全局对象之间的异同点。 全局对象是什么? 在Nodejs环境中&…

超详细|ChatGPT辅助论文编写教程

本教程讲述在论文编写中使用ChatGPT进行辅助,提供思路,提升效率 祝看到本教程的小伙伴们都完成论文,顺利毕业。 可以加QQ群交流,一群: 123589938 第一章 论文框架搭建 1.1 明确论文题目 1.1.1 适合的研究方向 首先赋…

STM32 低功耗-睡眠模式

STM32 睡眠模式 文章目录 STM32 睡眠模式第1章 低功耗模式简介第2章 睡眠模式简介2.1 进入睡眠模式2.1 退出睡眠模式 第3章 睡眠模式代码示例总结 第1章 低功耗模式简介 在 STM32 的正常工作中,具有四种工作模式:运行、睡眠、停止和待机模式。 在系统或…

动态规划之树形DP

动态规划之树形DP 树形DP何为树形DP 树形DP例题HDU-1520 Anniversary partyHDU-2196 Computer834. 树中距离之和 树形DP 何为树形DP 树形DP是指在“树”这种数据结构上进行的动态规划:给出一颗树,要求以最少的代价(或取得最大收益&#xff…

uniapp app端 echarts 设置tooltip的formatter不生效问题以及解决办法

需求一: y轴数据处理不同数据增加不同单位 需求二: 自定义图表悬浮显示的内容 需求一:实现方式 在yAxis里面添加formatter yAxis: [{//y轴显示value的设置axisLabel: {show: true,formatter (value, index) > {var valueif (value > 1…

怎么让表格中的一行数据 转置 为一列数据 (WPS )

例如 我现在有一列数据 我想要 变成一行 数据 1.首先选中想要转置的数据,然后control C 2.接着 点击你想放置数据的位置 右键 其实 关键是 找到 选择性复制 3. 找到转置,勾选 最后 确定 反之亦然

【Jmeter】 Report Dashboard 生成html图形测试报告

目录 背景 生成图形报告的方式 1、直接使用一个已存在的 CSV文件生成 2、负载测试完成后自动生成 使用示例 报告内容详情 测试报告摘要图 响应时间随时间变化曲线 活跃线程随时间变化曲线 I/O(Bytes)随时间变化曲线(忽略事务控制器示例结果) …

有哪些开源和非开源的项目管理工具?

开源和非开源项目管理工具各有其特点和优势。下面是一些常见的开源和非开源项目管理工具以及它们的简要介绍。 开源项目管理工具: OpenProject:OpenProject 是一个功能强大、易于使用的开源项目管理工具。它提供了项目计划、任务管理、团队协作、文档管…

http和https的区别?(网络通讯)

HTTP: 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种 网络协议 HTTPS: 是以安全为目标的 HTTP 通道,是 HTTP 的安全版。HTTPS 的安全基础是 SSL。 两者区别: 1、HTTPS …

# Windows 环境下载 Android 12源码

前言 Android 官网(该方式不适合 Windows 平台):https://source.android.com/source/downloading.html (备注自 2021 年 6 月 22 日起,安卓操作系统不再支持在 Windows 或 MacOS 上进行构建,如果要编译源码推荐先安装…