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

【树合集】

二叉树:

满二叉树:每一层的节点都达到最大值,如果树高h,节点总数有2^h-1。
完全二叉树:树高为h,前h-1层节点都是最大值,最后一层h不满且从左到右连续。

存储方式:顺序存储(数组)和链式存储(链表)。

二叉搜索树

特点:左节点值<跟节点的值,右节点值>跟节点的值,左右子树都是二叉搜索树,中序遍历是升序。

增删改查效率:因为增删改前都需要查询节点值,所以查询的时间复杂度就是增删改的时间复杂度,最好时间复杂度是O(logn),最坏时间复杂度是O(n)是因为退化成链表了。

删除操作(ps:删除情况多较重要,而增删改都是递归操作):

  • 删除根节点:特判一下是根节点,然后找寻左子树的最大节点,或者右子树的最小节点进行替换删除。
  • 删除孩子节点:该孩子节点的父节点指向nullptr即可。
  • 删除中间节点:托孤,该中间节点的父亲领养一个或两个孙子。

平衡二叉树AVL

特点:首先平衡二叉树的前提是二叉搜索树(中序遍历有序说明是二叉搜索树),且每个节点的左右子树的高度差绝对值(平衡因子)不超过1。

优点:时间复杂度为O(logN),解决了二叉搜索树成为链表的缺点,因为平衡因子使节点均匀分布,降低了树的高度,提高查询效率。

缺点:如果对AVL树做一些结构修改,插入删除等操作,性能是十分低下的,因为保证平衡因子需要多次旋转,最差的情况是可能一直要旋转持续到根的位置。

ps:旋转分四种情况:左旋,右旋、左右双旋、右左双旋。

红黑树

是一个自平衡的二叉搜索树,在插入和删除后能够通过左旋和右旋以及重新着色保持树的平衡,增删查的时间复杂度是O(logn)

特点:

  • 每个节点都有颜色,黑色或者红色。
  • 跟节点和叶子节点都为黑色。
  • 红色节点的左右孩子节点都为黑色。
  • 跟节点到叶子节点上黑色节点的个数一致。

红黑树和平衡二叉树的比较?

查询:选平衡二叉树

插删:选红黑树

  • 平衡二叉树的平衡规则相比于红黑树要严格,所以红黑树的高度会略高于平衡二叉树,所以平衡二叉树查询的时间复杂度要快一些
  • 当插入和删除操作进行时,平衡二叉树需要多次旋转达到严格的平衡规则,而红黑树的平衡规则不算严格所以最多需要两次旋转就可以达到平衡状态,所以黑红树插入和删除的时间复杂度要快一些。

前缀树:

特点:

  • 除了根节点外每个节点都包含一个字符
  • 每个节点的所有子节点,包含的字符不同
  • 从根节点到某节点:字符连接起来可以形成该节点的字符串

应用:利用字符串的公共前缀来减少查询时间,减少无所谓的字符比较,从而提高查询效率

B树:

B树是一个平衡多叉树,为什么不采用AVL树存储MySQL的索引文件呢,是因为随着索引文件增多,AVL树的树高会逐渐变高,那么根据索引读取数据的速度取决于磁盘IO次数,也就是树的高度(一次磁盘IO读取一个节点),采用B树也就是平衡多叉树可以降低树的高度,减少磁盘IO的次数,提高效率。

特点:

叶子节点和非叶子节点都存储着索引键值key和数据data。

B树的范围查询是中序遍历,没B+树好。

B+树:

B+树是MySQL关系型数据库innodb存储引擎下的存储索引文件的数据结构。首先它也是一个平衡多叉树,那为什么选择它呢?因为B+只有叶子节点存储索引键值key和数据data,非叶子节点存储的都是键值key,所以B+树的高度要比B树还要矮,磁盘IO次数更少,查询效率更高。

特点:

叶子节点存储键值和数据,非叶子节点只存储键值。

B+树的范围查询依靠叶子节点之间形成的双向链表。

ps:

所以B+树的范围查询比B树的中序遍历效率高太多,B+树用于MySQL的innodb存储引擎,而B树可以考虑单个索引的查询,用于nosql的MongoDB存储引擎。

http://www.xdnf.cn/news/1028845.html

相关文章:

  • 纯免费的零基础建站教程
  • 从Seq2Seq到QKV:深度解析注意力机制的核心逻辑
  • Python|GIF 解析与构建(6):手搓 tk 录制工具
  • 【互联网基础】互联网公司机房怎么设计
  • Python训练营-Day30-模块和库的导入
  • EDW2025|从传统BI到AI Ready:企业数据与分析能力的实施策略演进
  • Java 锁升级机制详解
  • 芯片测试之VIL/VIH(输入电平)Test全解析:从原理到实战
  • 高通IPA硬件加速介绍
  • 03 | 大模型微调 | 从0学习到实战微调 | 玩转Hugging Face与Transformers框架
  • manpath: can‘t set the locale; make sure $LC_* and $LANG are correct
  • 设备管理-Udev(一)
  • E10集成登录三方系统
  • Python基础补漏
  • ESP32服务器端编码
  • SAM分割一切-使用SAM自动生成对象掩码示例
  • NB/T 32004-2018测试是什么,光伏并网逆变器NB/T 32004测试项目
  • ServiceNow培训第1期
  • MATLAB实现图像纹理特征提取
  • PMP证-介绍
  • 准确--使用 ThinBackup 插件执行备份和恢复
  • Python训练营打卡 Day53
  • 华为数字化转型进阶——精读188页华为EBPM数字化全要素流程管理方法论【附全文阅读】
  • rocketmq producer和consumer连接不同的集群,如何隔离
  • 渗透实战:利用XSS获取cookie和密码
  • JDBC基础关键_002_JDBC 增删改
  • ​​Promise代码理解
  • 如何通过Python从DEM文件生成坡度和坡向数据
  • 读取OpenFOAM二进制polyMesh格式的C/C++程序
  • 手搓中文字符编程语言