在学习红黑树之前,先了解2-3树
2-3树是指一个结点有2个value和3个子树(因为可以有3个子结点,所以是2-3树中的3树),而2-3树中的2树就是我们的二叉树中的结点(一个value和两个子树)
由于2-3树的修改方法实在是过于繁琐,因为要考虑到不同的修改情况,有无3结点子树,都会是2-3树变得很复杂,为了简化逻辑结构,引入了红黑树
红黑树:实质上是一个二叉树,红黑树的“红”是指部分结点与它的子结点的左倾斜的连接时红色的,只能是左斜线,而红黑树中的“黑”是指除了红色的连接线外,其他是黑色的。
红黑树是含有红黑链接并满足下列条件的二叉查找树:
1. 红链接均为左链接;
2. 没有任何一个结点同时和两条红链接相连;
3. 该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同;
由于每个结点有且只用一个父节点,可以设置一个布尔变量color来辨明这是红色的线还是黑色的线
红黑树的结点类
package tree.redAndBlackTree; public class Node<Key,Value> { // 存储键 public Key key; // 存储值 private Value value; // 记录左子结点 private Node left; public Key getKey() { return key; } public void setKey(Key key) { this.key = key; } public Value getValue() { return value; } public void setValue(Value value) { this.value = value; } public Node getLeft() { return left; } public void setLeft(Node left) { this.left = left; } public Node getRight() { return right; } public void setRight(Node right) { this.right = right; } public boolean isColor() { return color; } public void setColor(boolean color) { this.color = color; } // 记录右子结点 private Node right; // 记录该节点和父节点的连线的颜色 private boolean color; public Node(Key key, Value value, Node left, Node right, boolean color) { this.key = key; this.value = value; this.left = left; this.right = right; this.color = color; } }在对红黑树进行删改查的时候,树的结构可能会出现一些变化,导致不是红黑树,例如连续的两条红线,或者是右斜线出现了红线,直接或间接使之出现了4-结点。这时候我们就需要对树进行旋转,然后使之变成一棵标准的红黑树
B树
B树是一种树状数据结构,它能够存储数据,对其进行排序并允许以O(logn)的时间复杂度进行增删改查的操作。
B树的一个结点可以有多个值,不同的实现有不同的个数
对于一棵M阶的B树
1每个结点最多能有M-1个key,并且以升序排列
2每个结点最多能有M个子结点
3根结点最少有两个子结点
在实际应用种B树的阶数一般比较大(通常大于100),所以,即使存储的大量数据,在某些特定的应用场景之下,就可以体现出它的优势。
B+树
B+树是对B树的一种变形树,它与B树的差异在于:
1。非叶结点仅具有索引功能,也就是说,非叶子几点只存储key,不存储value;
2.树的所有叶子结点构成一个有序链表,可以按照key的排序的次序遍历全部数据
B树和B+树的对比;
B树的优点在于:
1由于B+树在非叶子结点上,不包含真正的数据,只当索引使用,因此内存相同的情况下,能存储更多的key,
2.B+树的叶子结点都是相连的,因此对整棵树只需要一次线性遍历叶子结点就可以
B树的优点:B树只要找到key就可以直接找到value,而B+树每次需要找到叶子结点才可以找到value