从二叉树到B树再到红黑树

预备知识 什么是二叉搜索树?

二叉搜索树的性质:

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。

–参考百度百科

可以总结为以下几点:

  1. 二叉搜索树首先是一个二叉树或者空树;
  2. 每个非叶子节点满足左孩子节点 < 根节点 < 右孩子节点;
  3. 二叉搜索树的中序遍历为顺序结构。

简单画个图:
在这里插入图片描述
简单复习一下二叉树的三种遍历:

  • 中序遍历:左 -> 根 -> 右
  • 先序遍历:根 -> 左 -> 右
  • 后续遍历:左 -> 右 -> 根

正常状态下二叉搜索树查找一个节点的速度非常快,是对数时间,这里和二分搜索是相同的思路,查找节点的最大时间和二叉树的层树相关,速度远超过
list查找的O(n),但如果二叉搜索树在插入节点时的顺序本身就是有序的,例如上面的那个二叉树修改一下插入顺序你,有可能退化成list:

见下图:
在这里插入图片描述
这时候查找节点的时间复杂度退化成了O(n),这是很不理想的状态。

为了解决这个问题,发明了AVL树

什么是AVL树?

AVL树是一种结构平衡的二叉搜索树,为了避免上述退化现象的发生,发明了这种树,在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是。增加和删除元素的操作则可能需要借由一次或多次树旋转,以实现树的重新平衡。AVL树得名于它的发明者G. M. Adelson-Velsky和Evgenii Landis,他们在1962年的论文《An algorithm for the organization of information》中公开了这一数据结构。

AVL树必须满足以下条件:

  • 首先必须是一个二叉搜索树
  • 每个节点的左孩子和右孩子的高度差小于等于1 (平衡因子的取值范围为[-1 , 1]不满足条件时候需要进行调整)

AVL树的翻转:

不满足条件时候需要进行调整,调整一般分为LL型、RR型、LR型、RL型

LL型

由于在4的左孩子(L)的左子树(L)上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由1增至2。需要进行右旋,圈住的地方为不平衡的位置
在这里插入图片描述

不平衡的节点的2节点变为根节点,4变为右孩子节点

RR型

由于在4的右孩子(L)的右子树(L)上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由1增至2。需要进行左旋,圈住的地方为不平衡的位置
在这里插入图片描述

不平衡的节点的5节点变为根节点,4变为左孩子节点

LR型

由于在4的左孩子(L)的右子树(L)上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由1增至2。圈住的地方为不平衡的位置
在这里插入图片描述

不平衡的节点的2节点变为根节点,4变为右孩子节点,1变为左孩子节点

RL型

由于在4的右孩子(L)的左子树(L)上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由1增至2。圈住的地方为不平衡的位置
在这里插入图片描述

不平衡的节点的5节点变为根节点,4变为左孩子节点,6变为右孩子节点

什么是B树和B+树?

AVL树看着已经是不错了,但是还有有些问题,主要问题是插入元素时候基本都需要调整,这就相当费时,所以想着一个节点可以多存几个节点,这样可以进一步压缩树高,提高查找效率。
B树-多路查找树,这棵神奇的树是在Rudolf Bayer, Edward M. McCreight(1970)写的一篇论文《Organization and Maintenance of Large Ordered Indices》中首次提出的(wikipedia中:http://en.wikipedia.org/wiki/B-tree,阐述了B-tree名字来源以及相关的开源地址)

我们直接说2-3-4树,也就是4阶B树
4阶B树如下图所示:
在这里插入图片描述

m阶B树有以下几个性质:

  • 树中每个结点最多含有m个子树;
  • 除了根节点和叶子节点外,其余节点至少有[m / 2] 个子树;
  • 如根节点不是叶子节点,则最少有两个子树;
  • 如果一个节点有n 个关键字,则该结点有n + 1 个分支,子节点递增排序;
  • 所有的叶子节点都在同一层,子叶结点不包含任何信息。叶子结点处于同一层,可以用空指针表示,是查找失败到达的位置 每个结点的关键字数量为[ [m / 2] - 1 , m - 1]。
  • B树的查找和二叉搜索树基本一致,但在每个结点查找时候相当于做一个顺序搜索,找到可能的位置,然后向下寻找。

B树的插入操作:

在这里插入图片描述

当发现某个结点不满足要求时,便会进行分裂操作,分裂如下:
在这里插入图片描述

我们继续插入关键字 10 11 12
在这里插入图片描述

向上分裂:
在这里插入图片描述
在这里插入图片描述

B树的删除操作:

删除操作时需要牢记,删除后节点内的关键字数量是否满足要求。(即 本身关键码够?不够那么兄弟节点够? 兄弟节点都不够那么说明和兄弟合并可以满足小于等于m-1则需要合并,也可能会导致树的缩短)

(1)判断删除位置
a. 若删除关键字key在根节点,且无子女树,那么直接删除。
b. 若删除关键字key在非叶子节点,那么拿 该关键字的后继(前继也可以,优先后继,后面的向左兄弟节点借也优先右兄弟)覆盖删除关键字key且删除后继。
在这里插入图片描述
在这里插入图片描述

删除以后需要考虑其余节点是否还满足要求,显然52 65 78 节点出现问题
在这里插入图片描述

最后借鉴一个比较完整的步骤:
在这里插入图片描述

什么是红黑树?

红黑树(Red Black Tree) 是一种自平衡二叉查找树,有人觉得有了平衡二叉搜索树为什么还需要红黑树。原因如下:
平衡二叉树的有点很明显,就是查找速度很快,但缺点也很明显。就是每次插入时候㧀都需要进行调整,在频繁进行插入/删除的场景中,频繁的旋转操作使得AVL的性能大打折扣。
红黑树的特点:

  1. 是一颗二叉排序树
  2. 结点是红色或者黑色
  3. 根节点是黑色
  4. 所有的叶子节点都是黑泽(叶子节点时NIL节点)
  5. 每个红色节点的两个子节点都是黑色(从每个叶子到根的所有路径上不能有两个连续的红色结点)
  6. 从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点。

这些条件是不是有点多,看的确实晕晕的。
先说下红黑树的优点:

  • 红黑树通过牺牲严格的平衡,换取插入/删除时少量的旋转操作,整体性能优于AVL
  • 红黑树插入时的不平衡,不超过两次旋转就可以解决;
  • 删除时的不平衡,不超过三次旋转就能解决 红黑树的红黑规则,保证最坏的情况下,也能在O (log2n) 时间内完成查找操作。

、、、、持续更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大鱼qss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值