红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。
红黑树与AVL树的比较:
1.AVL树的时间复杂度虽然优于红黑树,但是对于现在的计算机,cpu太快,可以忽略性能差异
2.红黑树的插入删除比AVL树更便于控制操作
3.红黑树整体性能略优于AVL树(红黑树旋转情况少于AVL树)
红黑树的性质:
- 红黑树每一个节点都是有颜色的,不是黑色就是红色。
- 根节点必须为黑色。
- 所有叶子节点都为黑色,叶子节点是null,不存储实际数据。
- 每个红色的节点必须要有两个黑色的子节点,或者说每个叶子结点到根节点的所有路径上不能有连续的红色节点。
- 从根节点开始到任意叶子节点的路径上,黑色节点的数量必须是一致的。
- 节点的左右高度差最多不能超过两倍。
因为一棵由n个结点随机构造的二叉查找树的高度为lgn,所以顺理成章,二叉查找树的一般操作的执行时间为O(lgn)。但二叉查找树若退化成了一棵具有n个结点的线性链后,则这些操作最坏情况运行时间为O(n)。
红黑树虽然本质上是一棵二叉查找树,但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n)。
红黑树的插入操作
- 如果为空树,插入的节点为黑色。
- 树非空的话,插入的新节点为红色,此时检查父节点颜色,父节点为黑,插入完成。否则出现连续的红色节点,开始进行红黑树的插入调整。
情况1:插入cur后,由于有两个节点parent,uncle颜色都为红色,不符合红黑树的条件,所以进行调整,调整时应该注意pparent的右孩子的颜色,也要保证子树两边黑色节点的个数一致。如果pparent为根节点的话,必须将其变为黑色。
情况2:当插入节点cur时,父节点也为红色,cur节点没有uncle节点,这样不符合红黑树的性质,进行右旋转。
uncle节点存在时,并且为黑色,先将parent变为黑,pparent变为红色,此时不满足红黑树性质,然后在pparent节点进行右旋转。(保持左右黑色节点数一样)。
情况3:没有uncle节点时
uncle存在且为黑:
红黑树的删除
1.如果删除的是一个红色节点,那就相当于一个普通BST节点的删除,不用做任何的删除调整操作。
2.删除