【数据结构】二叉树、二叉搜索树、平衡二叉树、红黑树、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)
红黑树是一种自平衡的二叉查找树,具有以下特点:
-
节点是红色或黑色:每个节点要么是红色,要么是黑色。
-
根节点是黑色:根节点始终是黑色的。
-
叶子节点(NIL节点,空节点)是黑色:叶子节点是特殊的空节点,它们被认为是黑色的。
-
红色节点的子节点都是黑色的:红色节点不能连续出现,即红色节点的父节点和子节点都是黑色的。
-
从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点:这个特性保证了红黑树的平衡性,即任意两个叶子节点的路径长度相等。
自平衡:满足红黑树的条件即可、无需像平衡二叉树那样高度差绝对值必须小于等于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
相关文章:
【数据结构】二叉树、二叉搜索树、平衡二叉树、红黑树、B树、B+树
概述 二叉树(Binary Tree):每个节点最多有两个子节点(左子节点和右子节点),没有限制节点的顺序。特点是简单直观,易于实现,但查找效率较低。 二叉搜索树(Binary Search…...
【JVM】(二)深入理解Java类加载机制与双亲委派模型
文章目录 前言一、类加载过程1.1 加载(Loading)1.2 验证(Verification)1.3 准备(Preparation)1.4 解析(Resolution)1.5 初始化(Initialization) 二、双亲委派…...
npm i 报错项目启动不了解决方法
1.场景 在另一台电脑低版本node环境跑的react项目,换到另一台电脑node18环境执行npm i时候报错 2.解决方法 脚本前加上set NODE_OPTIONS--openssl-legacy-provider...
【从零开始学习JAVA | 第三十七篇】初识多线程
目录 前言: 编辑 引入: 多线程: 什么是多线程: 多线程的意义: 多线程的应用场景: 总结: 前言: 本章节我们将开始学习多线程,多线程是一个很重要的知识点ÿ…...
微信新功能,你都知道吗?
近日iOS 微信8.0.40正式版来了,一起来看看有哪些变化? 1、朋友圈置顶 几个月前微信开始内测「朋友圈置顶」功能,从网友们的反馈来看,iOS 微信 8.0.40 似乎扩大了内测范围,更多用户可以体验到该功能了。 大家可以去自己…...
Android 中 app freezer 原理详解(二):S 版本
基于版本:Android S 0. 前言 在之前的两篇博文《Android 中app内存回收优化(一)》和 《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过 CachedAppOptimizer 类管理,为什么叫这个名字,而不…...
Vue3_04_ref 函数和 reactive 函数
ref 函数 声明变量时,赋值的值要写在 ref() 函数中修改变量时,变量名.value xxx在模板中使用时可以省略掉 .value,直接使用变量名即可 <template><h1>一个人的信息</h1><h2>姓名:{{name}}</h2><…...
05 Ubuntu下安装.deb安装包方式安装vscode,snap安装Jetbrains产品等常用软件
使用deb包安装类型 deb包指的其实就是debian系统,ubuntu系统是基于debian系统的发行版。 一般我们会到需要的软件官网下载deb安装包,然后你既可以采用使用“软件安装”打开的方法来进行安装,也可以使用命令行进行安装。我推荐后者ÿ…...
性能测试jmeter连接数据库jdbc(sql server举例)
一、下载第三方工具包驱动数据库 1. 因为JMeter本身没有提供链接数据库的功能,所以我们需要借助第三方的工具包来实现。 (有这个jar包之后,jmeter可以发起jdbc请求,没有这个jar包,也有jdbc取样器,但不能发起…...
8.3 C高级 Shell脚本
写一个脚本,包含以下内容: 显示/etc/group文件中第五行的内容创建目录/home/ubuntu/copy切换工作路径到此目录赋值/etc/shadow到此目录,并重命名为test将当前目录中test的所属用户改为root将test中其他用户的权限改为没有任何权限 #!/bin/b…...
2023年华数杯A题
A 题 隔热材料的结构优化控制研究 新型隔热材料 A 具有优良的隔热特性,在航天、军工、石化、建筑、交通等 高科技领域中有着广泛的应用。 目前,由单根隔热材料 A 纤维编织成的织物,其热导率可以直接测出;但是 单根隔热材料 A 纤维…...
【零基础学Rust | 基础系列 | 函数,语句和表达式】函数的定义,使用和特性
文章标题 简介一,函数1,函数的定义2,函数的调用3,函数的参数4,函数的返回值 二,语句和表达式1,语句2,表达式 总结: 简介 在Rust编程中,函数,语句…...
加解密算法+压缩工具
sha256 工具类 package com.fanghui.vota.packages.util;import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.math.BigInteger…...
FeignClient接口的几种方式总结
FeignClient这个注解,已经封装了远程调用协议。在springboot的开发,或者微服务的开发过程中,我们需要跨服务调用,或者调用外部的接口,我们都可以使用FeignClient。 一、FeignClient介绍 FeignClient 注解是 Spring Cl…...
springBoot多数据源使用tdengine(3.0.7.1)+MySQL+mybatisPlus+druid连接池
一、安装部署 1、我这里使用的 3.0.7.1版本,因为我看3.x版本已经发布了一年了,增加了很多新的功能,而且3.x官方推荐,对于2.x的版本,官网都已经推荐进行升级到3.x,所以考虑到项目以后的发展,决定…...
剑指Offer 05.替换空格
剑指Offer 05.替换空格 目录 剑指Offer 05.替换空格05.替换空格题目代码(容易想到的)利用库函数的方法题解(时间复杂度更低)面试:为什么java中String类型是不可变的 05.替换空格 题目 官网题目地址 代码(…...
ChatGPT的功能与特点
随着人工智能技术的不断发展,ChatGPT作为OpenAI公司开发的基于GPT-3.5架构的大型语言模型,正引领着智能交互的新纪元。ChatGPT的功能与特点使其能够在多个领域展现出惊人的能力,本文将深入探讨ChatGPT的功能与特点,以及它在人工智…...
Vue2.0基础
1、概述 Vue(读音/vju/,类似于view)是一套用于构建用户界面的渐进式框架,发布于2014年2月。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层(也就是可以理解为HTMLCSSJS)ÿ…...
rust 如何定义[u8]数组?
在Rust中,有多种方式可以定义 [u8] 数组。以下是一些常见的方式: 使用数组字面量初始化数组: let array: [u8; 5] [1, 2, 3, 4, 5];使用 vec! 宏创建可变长度的数组: let mut vec: Vec<u8> vec![1, 2, 3, 4, 5];使用 v…...
关于Hive的使用技巧
前言 Hive是一个基于Hadoop的数据仓库基础架构,它提供了一种类SQL的查询语言,称为HiveQL,用于分析和处理大规模的结构化数据。 Hive的主要特点包括: 可扩展性:Hive可以处理大规模的数据,支持高性能的并行…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
