赞
踩
1.左子树上所有结点的值均小于或等于它的根结点的值。
2.右子树上所有结点的值均大于或等于它的根结点的值。
3.左、右子树也分别为二叉排序树。
二分查找的思想,查找所需的最大次数等同于二叉查找树的高度。
缺点:二叉查找树多次插入新节点导致不平衡。
是自平衡的二叉查找树,除了符合二叉查找树的基本特性外,还有以下特性:
1.节点是红色或黑色。
2.根节点是黑色。
3.每个叶子节点都是黑色的空节点(NIL节点)。
4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
红黑树从根到叶子的最长路径不会超过最短路径的2倍。
怎么保证一棵红黑树始终是红黑树?变色和旋转,旋转分为左旋转和右旋转。
变色:
为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。
左旋转:
逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子。
右旋转
逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子。
遵循高度平衡,任何结点的两个子树高度差都不超过1。
在AVL树当中,我们通过“平衡因子”来判断一颗二叉树是否符合高度平衡。
对于AVL树的每一个结点,平衡因子是它的左子树高度和右子树高度的差值。只有当二叉树所有结点的平衡因子都是-1, 0, 1这三个值的时候,这颗二叉树才是一颗合格的AVL树。
下图就是一颗典型的AVL树,每个节点旁边都标注了平衡因子:
其中结点4的左子树高度是1,右子树不存在,所以该结点的平衡因子是1-0=1。
结点7的左子树不存在,右子树高度是1,所以平衡因子是0-1=-1。
所有的叶子结点,不存在左右子树,所以平衡因子都是0。
当AVL树插入或者删除节点的时候,平衡可能被打破。
重新恢复AVL的平衡: 左旋转和右旋转
左旋转:
逆时针旋转AVL树的两个结点X和Y,使得父结点被自己的右孩子取代,而自己成为自己的左孩子。说起来有些绕,见下图(标号1,2,3的三角形,是结点X和Y的子树):
右旋转:
顺时针旋转AVL树的两个结点X和Y,使得父结点被自己的左孩子取代,而自己成为自己的右孩子。见下图:
为什么MySQL索引用B+树?不用二叉查找树?
考虑磁盘IO。数据库索引是存储在磁盘上的,当数据量比较大的时候,索引的大小可能有几个G甚至更多。当我们利用索引查询的时候,不可能把整个索引都加载到内存,能做的只有逐个加载每个磁盘页,这里的磁盘页对应着索引树的节点。
最坏情况下,磁盘IO次数等于索引树的高度。
为了减少磁盘IO次数,就要把原来“瘦高”的树变得“矮胖”。这就是B-树的特征之一。
B树是一种多路平衡查找树,它的每一个节点最多包含k个孩子,k被称为B树的阶。k的大小取决于磁盘页的大小。
一个m阶的B树具有如下几个特征:
1.根结点至少有两个子女。
2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
4.所有的叶子结点都位于同一层。
5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。
B-树主要用于文件系统及部分数据库索引,比如著名的非关系型数据库MongoDB。
大部分关系型数据库,比如MySQL,使用B+树作为索引。
一个m阶的B+树具有如下几个特征:
1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
每一个父节点的元素都出现在子节点中,是子节点的最大或者最小元素。
根节点的最大元素等同于整个B+树的最大元素。
每一个叶子节点都带有指向下一个节点的指针,形成了一个有序链表。
卫星数据:指的是索引元素所指向的数据记录,比如数据库中的某一行。
在B-树中,无论是中间节点还是叶子节点都带有卫星数据。
B-树中的卫星数据(Satellite Information):
在B+树中,只有叶子节点带有卫星数据,其余中间节点仅仅是索引,没有任何数据关联。
B+树中的卫星数据(Satellite Information):
在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。
B+树的中间节点没有卫星数据,所以同样大小的磁盘页可以容纳更多的节点元素。这就意味着,数据量相同的情况下,B+树的结构比B-树更加矮胖。因此查询时磁盘IO次数更少。
B+树的查询必须最终查找到叶子节点,而B-树只要找到匹配元素即可,无论匹配元素处于中间节点还是叶子节点。因此B-树的查找性能并不稳定,最好情况是只查根节点,最坏情况是查到叶子节点。而B+树的每次查找都是稳定的。
综合起来,B+树相比于B-树的优势:
1. IO次数更少 2. 查询性能稳定 3. 范围查询简便。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。