引言
树是一种数据结构,对于数据结构,需要记住的是概念特点,和具有的功能
- 根节点:最上面的那个节点
- 叶子节点:最下面一层的节点
二叉排序树(二叉查找树):
每个节点一个元素,两个分支,当插入有序数列会造成单枝
特点
- 左子节点小于等于父节点
- 右子节点大于等于父节点
- 左右子节点可以作为父节点
功能:
查找、插入、删除
红黑树
两个分支,是一种自平衡二叉查找树,避免单枝问题
特点
- 每个节点或者是黑色,或者是红色。
- 根节点是黑色
- 每个null叶子节点是黑色
- 如果一个节点是红色的,则它的子节点必须是黑色的。
- 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点
红黑树和二叉查找树的区别,红黑树是局部平衡,二叉是全局平衡,二叉只能旋转,红黑可以旋转和变色
最大的区别是
红黑树并不是严格意义上的左右子树深度差不大于1
因此红黑树插入删除后维持平衡消耗的操作更少
功能:
查找、插入、删除
为了保证满足红黑树规则,在增删节点后可能进行旋转和变色
旋转:子节点位置转换
变色:红黑色转换
红黑树和平衡二叉树区别:
-
红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。
-
平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。
B树(多叉查找树):
每个节点有多个元素,有多个分支
特点
- 根结点至少有两个子女;
- 每个非根节点所包含的元素数满足大于层数的一半小于层数
- 除根结点和叶子结点以外的所有结点的子女数目正好是元素数加1
- 所有的叶子结点都位于同一层。
B-树
- 集合分布在整棵树中;
- 任何一个元素出现且只出现在一个结点中;
- 搜索有可能在非叶子结点结束;
- 其搜索性能等价于在元素全集内做一次二分查找;
- 自动层次控制;
B+和b-数的区别是,B+树叶节点两两相连可大大增加区间访问性,可使用在范围查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找
B+树
- 有n棵子树的结点中含有n个元素
- 所有的叶子结点中包含了全部元素的信息,及指向含有这些元素记录的指针,且叶子结点本身依元素的大小自小而大的顺序链接。
- 所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)
- B+树的有效内容均在叶子节点
B+树的头指针有两个,一个指向根节点,另一个指向最小的元素,因此B+树有两种遍历的方式:
1.从根节点开始随机查询
2.从最小关键词顺序查询
为什么说B+树比B 树更适合实际应用中操作系统的文件索引和数据库索引?
B+树的磁盘读写代价更低
B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。
举个例子,假设磁盘中的一个盘块容纳16bytes,而一个关键字2bytes,一个关键字具体信息指针2bytes。一棵9阶B-tree(一个结点最多8个关键字)的内部结点需要2个盘快。而B+树内部结点只需要1个盘快。当需要把内部结点读入内存中的时候,B 树就比B+树多一次盘块查找时间(在磁盘中就是盘片旋转的时间)。
B+树的查询效率更加稳定
由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。