红黑树(一)引导篇——从二叉树到红黑树
这段时间有空,把之前学的红黑树整理了一下,先给大家推荐一个生成红黑树的网站,可以用于检测大家一会写的代码对不对。
https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
这篇就不讲红黑树咋写,就给大家说下,红黑树是怎么来的。
一、二叉树 和 多叉树
二叉树作为一个最基本的树结构,大家一定都认识。
二叉树的节点,最多有两个子节点
那么,相对应的还有叫做多叉树。
多叉树的子节点可以是任意个
二、 多叉树 到 平衡树(BT)
平衡树的子节点树是任意的
它是指任意节点的子树的高度差都小于等于1,
常见的平衡树有:B树(平衡多路查找树)、AVL树(二叉平衡搜索树)
三、平衡树 到 B树、AVL树
3.1 B树
B树不是一颗树,是泛指具备B树性质的所有树
B树属于多叉树,又名平衡多路查找树
对B树子规定节点个数的不同,叫m阶B树。m阶B树中,每个结点的子节点不大于m个
常见的B树有:2-3树(3阶B树)、2-3-4树(4阶B树)
B树 和 B+树(这个跟红黑树没关系)
顺带提一下 B树 和 B+树
B树 和 B+树 的一个很大的区别就是: B+树的非叶子结点不存数据,而B树所有结点都存数据
这个特性就导致了 B+树 检索效率高于 B树
为什么呢
3.1.1 大家看上去是这样的:
B+树的数据只存在叶子结点上,B树所有结点都存数据。
进而得出结论: 同样多的数据,B+树的节点数 > B树的结点树。
这是对的,然后大家就疑惑了,结点多查找效率应该慢才对,为什么B+树的查找效率反而更高,这不科学啊
3.1.2 其实是这样的
查找效率高针对的是海量数据,那么这棵树就会很大。
大到什么程度呢?你的内存放不开这棵树,必须要分多次把树读到内存里才行,比如说:数据库的数据
那么,对于把树读到内存里面,其实就是一次I/O,一次I/O的时间远远大于遍历一颗树的时间。
遍历的时候,I/O越少,速度越快
反过来看 B+树 和 B树 , B+树的非叶子结点不存数据,只作索引,所以B+树的非叶子结点更小,一次I/O能加载更多的索引(非叶子结点),I/O次数少,所以速度快!!!
3.2 AVL树
AVL树是一颗二叉搜索树,同时具备平衡树的特点
增加和删除结点,可通过一次或多次树旋转来重新平衡这个树。
四、B树 到 2-3-4树
刚刚我们说到
2-3-4树 是 B树 的一个的实例,也叫做 4阶B树
2-3-4树的性质比较多,下篇我们详细说
五、2-3-4树、AVL树 到 红黑树
2-3-4树的性质很多,而且实现起来很复杂,所以就有个大佬 Rudolf Bayer 就找到了一个办法:
把复杂的 2-3-4树,简化成了二叉树,这个二叉树能与2-3-4树对应起来,使其具备2-3-4树的所有性质。
可以看出,红黑树具备2-3-4树、AVL树的性质,也就是具备:平衡树、排序树、二叉树的性质。
End