注:本文参考王道考研及大雪菜
平均查找长度ASL(查找成功/查找失败)
0. 二叉排序(查找)树 BST
左子树<根<右子树,不允许出现一样的值,中序遍历得到递增序列
便于搜索、插入,删除麻烦一点
-
插入:新插入的节点一定是叶子节点
-
删除:先找位置
2.1 待删除节点是叶子节点直接删
2.2 待删除节点只有左子树或只有右子树,直接让这个独子上来代替爹:
2.3 待删除节点左右子树都不为空,挑选何时的候选人上来
选右子树的最左节点60或者左子树的最右节点30来代替50.
选60:用60的值替代50,然后删除60节点原来在的位置,必跳转到2.1/2.2(不会有左子树)
选30:用30的值替代50,然后删除30节点原来在的位置,必跳转到2.1/2.2(不会有右子树)
1. 平衡二叉树 AVL
对二叉排序树进行改进:左右子树高度只差不超过1。以查为主
调整(插入)最小不平衡子树:
- LL:
- RR
- LR
- RL
在AVL上删除某节点:
(1)先按照二叉排序树的方法按照三种情况删除某节点
(2)从删除节点一路向上看有没有不平衡节点,找到最小不平衡子树、最小不平衡子树根节点的最高儿子和最高孙子
(3)针对这三个彩色节点调整平衡
王道 平衡二叉树的删除
2. 红黑树 RBT
也是一种二叉排序树,左<根<右
对BST的改进(红黑树定义):
性质:
频繁插入删除,实际应用中多
2.1 红黑树的插入
总结:
2.2 红黑树的删除
这部分王道没讲,所以先放个y神在这里
3. B/B+树
3.1 B树(多路 平衡 查找树)
多叉查找树+每个节点的子树高度相同(绝对平衡)
总结:一共两个限制
(1)每个节点子树高度相同
(2)对于m阶B树(树中节点的最多叉数为m)有:
B树对节点关键字个数有要求(强制要求):
这么做是为了使B树不要太空,层数尽可能小,便于搜索
(1)B树的插入
先查找位置,只能在终端节点插入
如果插入后某个节点爆了,要将该节点分裂,新的中心节点为中间值,提到父节点当中,剩余数值分两份(分裂)
具体提到父节点的哪里:指向当前节点的指针的右侧
注:可能回出现上面没有父节点的情况,需要new一个新父节点
(2)B树的删除
删除时的几种情况:
A。直接删:查找出待删除节点的直接前驱/直接后继,拿上来代替此待删除节点
B。删完之后当前节点中隔板数过少:借右面兄弟节点以及父节点隔板,重新分配(我,父,兄)三个节点的隔板
3.2 B+树
B树是隔板,查找时可能停留在某一层就找到了
B+树是分块查找,只有走到叶子才算真正找到了
下图中,15表示:其子树中,最大值为15
[0,15] [16,56] [57,无穷]
只有访问到叶子节点才能获取到真正的信息,非叶节点仅起索引作用
m阶B树(节点伸出去的最大叉数为m),每个节点至少[m/2]个叉【向上取整】
m阶B+树(节点伸出去的最大叉数为m),每个节点至少[m/2]个叉【向上取整】
对比:
场景题:3层B+树最多能存多少数据
https://blog.csdn.net/csdnlijingran/article/details/102309593