几种树结构的总结

背景:之前一直都在说什么什么树,但是除了基本的二叉树概念的概念。稍微一些具体的树的结构、特性、使用场景等,都是很模糊的。所以今天来整理下出现频率高的几种树的知识。


总览

这里引用下大牛整理的图.

在这里插入图片描述

二叉查找树

二叉查找树,又称为二叉搜索树。非平衡

结构

  1. 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
  3. 左、右子树也分别为二叉排序树;
  4. 没有键值相等的节点。

特性

  • 对二叉查找树进行中序遍历,即可得到有序的数列。(左,中,右)

使用场景

平衡二叉树

  • 产生原因:二叉搜索树是非平衡二叉树,最恶劣的情况会导致二叉搜索树接近于链表。搜索时因为树的深度太深,导致增加搜索时间! 而我们期望一颗搜索树的深度为为logn。于是就有了平衡二叉树的概念。
  • 平衡二叉树又分为几种:VAL树、红黑树

VAL树(左子树、右子树深度相差为1----- 比较严格的)

  • 被称为最早的自动平衡二叉查找树高度平衡树

特性

  • 把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。
  • 但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间。

结构

  • 就是一棵高度平衡,数据遵守中序遍历的树

树的增、删操作后树如何保持平衡(通过旋转)

在树的增删操作之前,我们需知道树调节平衡的四种情况
链接: link在这里插入图片描述
单旋(左旋、右旋)解决左左、右右的情况。

左旋

左旋解决右右的情况.
在这里插入图片描述
左旋后:
根节点:原始根节点的右节点 -> 新树的根节点。
树的右边: 新的根节点右边保持不变。
树的左边: 原始根节点连接新树始根节点的右节点。

右旋

在这里插入图片描述
如图所示,根左旋节点操作相反。

双旋

左右情况下 先进行左旋、再进行右旋(跟上面的左旋和右旋步骤情况不同)
在这里插入图片描述

红黑树(任意节点到其子节点中,黑色节点数目保持一致)

红黑树在线生成链接

  • 树的左右高度为相同差一倍。条件稍微宽松,所以红黑树在做增删的时候,也就是写的时候不用经常变化。
  • 红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(logn)时间内做查找,插入和删除,这里的n是树中元素的数目。
    • 关联数组:键是字符串
    • 索引数组(正常数组、一般数组):键是正常的自然数
  • 与平衡二叉树效率的区别:VAL频繁的查找、插入、删除会消耗log2n

结构

红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制的一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

性质1. 节点是红色或黑色。

性质2. 根是黑色。

性质3. 所有叶子都是黑色(叶子是NIL节点)。

性质4. 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)

性质5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。(看分层,都是黑、红、黑、红的顺序)

在这里插入图片描述

特性

  • 这些约束确保了红黑树的关键特性: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的.(最短的可能路径都是黑色节点,最长的可能路径有交替的红色和黑色节点)

红黑树保持平衡

在这里插入图片描述

思考 jdk1.8后。hashMap的结构为数组+链表,当链表的长度>8时,链表变为红黑树。为什么不变为VAL,或者BST呢?

  • 针对于BST,二叉搜索树,如果增加节点为递增的话,那么该数据结构近似为链表。
  • 针对于VAL,VAL会严格遵守左右子树高度差一的情况,所以会经常进行旋转;不利于写操作。
  • 针对红黑树,允许左右深度差一倍。所以有利于写操作。而读操作也能保证复杂度近似为Log N

B树

引用
B树也是一种用于查找的平衡树,但是它不是二叉树。

B树的定义:

  • B树(B-tree)是一种树状数据结构,能够用来存储排序后的数据。这种数据结构能够让查找数据、循序存取、插入数据及删除的动作,都在对数时间内完成。
  • B树,概括来说是一个一般化的二叉查找树,可以拥有多于2个子节点。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。这种数据结构常被应用在数据库和文件系统的实作上。

在这里插入图片描述

定义

  • 一种二叉搜索树。
  • 除根节点外的所有非叶节点至少含有(M/2(向上取整)-1)个关键字,每个节点最多有M-1个关键字,并且以升序排列。所以M阶B树的除根节点外的所有非叶节点的关键字取值区间为[M/2-1(向上取整),M-1]。
  • 每个节点最多有M-1个关键字。

使用场景
节点值要回到内存当中
内存中:在节点中找关键字
磁盘中:在B树中找节点

B+树

  • 有n棵子树的非叶子结点中含有n个关键字(b树是n-1个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(b树是每个关键字都保存数据)。
  • 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接(叶子节点组成一个链表)。
  • 所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
  • 通常在b+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。
  • 同一个数字会在不同节点中重复出现,根节点的最大元素就是b+树的最大元素。

B+树与B树对比

  • B树每个节点都存储数据,所有节点组成这棵树。B+树只有叶子节点存储数据(B+数中有两个头指针:一个指向根节点,另一个指向关键字最小的叶节点),叶子节点包含了这棵树的所有数据,所有的叶子结点使用链表相连,便于区间查找和遍历,所有非叶节点起到索引作用。

  • B树中叶节点包含的关键字和其他节点包含的关键字是不重复的,B+树的索引项只包含对应子树的最大关键字和指向该子树的指针,不含有该关键字对应记录的存储地址。

  • B树中每个节点(非根节点)关键字个数的范围为m/2(向上取整)-1,m-1,并且具有n个关键字的节点包含(n+1)棵子树。B+树中每个节点(非根节点)关键字个数的范围为m/2(向上取整),m,具有n个关键字的节点包含(n)棵子树。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值