【数据结构】二叉树、二叉搜索树、平衡二叉树、红黑树、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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络基础进阶之路】设计网络划分的实战详解

PS:本要求基于华为的eNSP模拟软件进行 具体要求: 完成步骤: 1、对192.168.1.0/24进行子网划分 2、对每一个路由器进行IP的配置 3、开始静态路由的书写,在写之前,我们可以先对每一个路由器写一条通向右边的缺省路由&…

父类B为抽象类,继承接口A,子类C必须实现B和A中的抽象方法

1. 子类C必须实现A中的抽象方法。 2. 子类C必须实现B中的抽象方法 3 在1中,我们知道,C不显示实现A,依旧要实现A的所有方法。 然而代码设计中,C可能会依旧显示实现A,然后实现A的所有方法。(这样做的好处还…

本科专科毕业论文如何选题-附1000多论文题目-论文选题--【毕业论文】

文章目录 本系列校训毕设的技术铺垫论文选题选题目的和意义:选题举例参考文献 配套资源 本系列校训 互相伤害互相卷,玩命学习要你管,天生我才必有用,我命由我不由天! 毕业论文不怕难,毕业设计来铺垫&#…

【LeetCode】对称二叉树 平衡二叉树

对称二叉树 即先判断根节点的左右子树相不相同,相同时,再判断左孩子的左子树和右孩子的右子树比较,左孩子的右子树和右孩子的左子树(当两个都相同时才是对称的).....依次递推,过程中并设置一些不满足相同的…

Java生成二维码

使用google的开发工具包ZXing生成二维码 一、导入jar包 <!-- zxing生成二维码 --> <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version> </dependency><depen…

FFmpeg常见命令行(一):FFmpeg工具使用基础

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;FFmpe…

【分布式系统】聊聊系统监控

对于分布式系统来说&#xff0c;出现故障的是常有的事情&#xff0c;如何在短时间内找到故障的原因&#xff0c;排除故障是非常重要的&#xff0c;而监控系统是就像系统的眼睛可以通过分析相关数据&#xff0c;进一步管理和运维整个分布式系统。 监控系统的的基本功能包含 全…

C++初阶函数重载

目录 函数重载函数名修饰规则 函数重载 C语言不允许同名函数 CPP可以&#xff0c;但是要求构成函数重载 函数名相同&#xff0c;参数不同(参数类型、参数个数、参数类型的顺序)&#xff0c;返回值不同不能构成重载 int Add(int left, int right) {cout << "int Ad…

【机器学习】Gradient Descent for Logistic Regression

Gradient Descent for Logistic Regression 1. 数据集&#xff08;多变量&#xff09;2. 逻辑梯度下降3. 梯度下降的实现及代码描述3.1 计算梯度3.2 梯度下降 4. 数据集&#xff08;单变量&#xff09;附录 导入所需的库 import copy, math import numpy as np %matplotlib wi…

深入了解PostgreSQL:高级查询和性能优化技巧

在当今数据驱动的世界中&#xff0c;数据库的性能和查询优化变得尤为重要。 POSTGRESQL作为一种开源的关系型数据库管理系统&#xff0c;在处理大规模数据和复杂查询时表现出色。 但随着数据量和查询复杂性的增加&#xff0c;性能问题可能会显现出来。 本文将深入探讨POSTGR…

【蓝桥杯备考资料】如何进入国赛?

目录 写在前面注意事项数组、字符串处理BigInteger日期问题DFS 2013年真题Java B组世纪末的星期马虎的算式振兴中华黄金连分数有理数类&#xff08;填空题&#xff09;三部排序&#xff08;填空题&#xff09;错误票据幸运数字带分数连号区间数 2014年真题蓝桥杯Java B组03猜字…

App Cleaner Uninstaller for Mac 苹果电脑软件卸载工具

App Cleaner & Uninstaller 是一款非常有用的 Mac 应用程序清理和卸载工具。它可以彻底地清理系统中的应用程序、扩展和残留文件&#xff0c;以释放磁盘空间并优化系统性能。 此外&#xff0c;它还提供了磁盘空间监控和智能清理建议等功能&#xff0c;使用户可以轻松地管理…

GD32F103VE侵入事件

GD32F103VE的TAMPER引脚(PC13)&#xff0c;当PC13输入低电平时&#xff0c;会产生一个侵入检测事件。它会将所有“数据备份寄存器”内容清除。 这个功能有什么用&#xff1f; 一是防止被人开壳&#xff0c;抄袭。二是自毁功能。 直奔主题&#xff0c;多一句就是浪费时间。测试…

双环抱式“星环“座舱设计:比亚迪仰望U8内饰曝光,搭载骁龙8+车机

根据8月3日的消息&#xff0c;比亚迪车机先前使用的高通骁龙625芯片在网友中引发了一些批评&#xff0c;不过随着比亚迪将车机升级为骁龙665、骁龙690/695&#xff0c;这个问题得到了改善。 与此同时&#xff0c;大多数主流车企还在继续使用高通8155芯片&#xff08;相当于骁龙…

项目进度管理软件可以解决哪些难题?

项目进度管理是在项目实施过程中&#xff0c;对各阶段的进展程度和项目最终完成的期限所进行的管理。它以确保项目能在满足其时间约束条件的前提下实现其总体目标。 项目进度管理软件可以解决以下难题&#xff1a; 一、进度跟踪 如果没有完善的进度计划&#xff0c;项目很难…

mac切换jdk版本

查询mac已有版本 1、打开终端&#xff0c;输入&#xff1a; /usr/libexec/java_home -V注意&#xff1a;输入命令参数区分大小写(必须是-V) 2.目前本地装有两个版本的jdk xxxxedydeMacBook-Pro-9 ~ % /usr/libexec/java_home -V Matching Java Virtual Machines (2):20.0.1 (…

yolov5中的best.pt是如何确定的

在yolov5 的使用过程中几乎都会发现的问题&#xff1a; 训练结果有last.pt和best.pt , last.pt好理解&#xff0c;就是最后一个epoch的输出&#xff0c;但是best是啥意思&#xff1f;怎么才算best&#xff1f; 我们来一行行看train.py源码 追溯到./utils/metrics.py中的fitn…

-bash: fork: retry: Resource temporarily unavailable 问题解决

错误提示&#xff1a; -bash: fork: retry: Resource temporarily unavailable 错误分析&#xff1a;之前已经出现过这种资源限制的报错提醒&#xff0c;然后整个系统可用的连接数就已经用完了&#xff0c;无法使用工具来获取系统信息&#xff0c;所以将运行的任务脚本kill后开…

使用AIGC工具提升安全工作效率

新钛云服已累计为您分享760篇技术干货 在日常工作中&#xff0c;安全人员可能会涉及各种各样的安全任务&#xff0c;包括但不限于&#xff1a; 开发某些安全工具的插件&#xff0c;满足自己特定的安全需求&#xff1b;自定义github搜索工具&#xff0c;快速查找所需的安全资料、…

离散Hopfield神经网络的联想记忆与matlab实现

1案例背景 1.1离散Hopfield神经网络概述 Hopfield网络作为一种全连接型的神经网络,曾经为人工神经网络的发展开辟了新的研究途径。它利用与阶层型神经网络不同的结构特征和学习方法,模拟生物神经网络的记忆机理,获得了令人满意的结果。这一网络及学习算法最初是由美国物理学家…