平衡二叉查找树
普通平衡二叉查找树
平衡二叉树定义是按照有序排列成树状,左子树数据大于右子树,任意节点的左右子树高度不能大于1
优点:可以保证绝对的平衡
缺点:当进行删除节点和新增节点,树进行自平衡的时候,需要频繁树旋转,性能比较低
红黑树
红黑树也是一种平衡二叉树,但是定义不同,红黑树要求是:每个节点要么是红色节点要么是黑色节点,叶子节点都是黑的,如果节点是红的,那么子节点一定是黑色的,不可以出现连续的红节点,可以出现连续的黑节点,任何子树的黑节点个数需要保证相同
优点:红黑树是普通红黑树的改进版本,可以看出允许连续黑节点,这样就可以打破任意节点的左右子树高度不能大于1的规则,没有要求绝对的平衡,对于删除和新增,可以一定程度减少树的旋转
应用范围:适用于数据的查找,但是数据量比较大情况依然树的高度会很高(只有二叉),所以一般用于内存操作,不适合IO操作,比如JDK的HashMap就使用了这个结构来提高检索速度
平衡多路查找树
b树
定义一个m阶的树,要求每个节点都只能包含m-1个节点,也意味着每个节点只能有m-1个子节点,同时也要满足平衡树的定义,左右子树高度差不能大于1
优点: 相对于平衡二叉树,这里变成了多路,可以容纳更多数据,同时树的高度也不会很高,这样查找效率更高
缺点:效率不是很稳定,因为非叶子节点也是存全量数据的,同时进行范围查找也不方便,需要进行中序遍历之类的。还有一点就是建立二级索引也要存全量数据,很不方便,而且非叶子节点存全量数据,会使得单个节点在有限数据字节文件情况下,存的数据比较少,树的高度依然会比较高
b+树
定义一个m阶的树,要求每个节点都只能包含m-1个节点,也意味着每个节点只能有m-1个子节点,同时也要满足平衡树的定义,左右子树高度差不能大于1,但是全量数据只存在叶子节点,非叶子节点只存关键检索数据
优点:数据只存叶子节点,意味着检索的性能都稳定的;同时非叶子节点也只存关键字数据,这样树的高度相比b树会更低,同时叶子节点和非叶子节点都是有链表相连,范围查询也比较方便;还有可以比较方便建立二级索引,不需要存全量数据,只要存索引和一级索引数据相关联就可以。
应用范围:适合用于大型中间件的存储,树的高度很低,IO操作次数很少。比如mysql数据库就是使用这种结构,方便进行范围查找和二级索引的灵活建立。