俺是非科班出身,所以理解红黑树用了好久,下面说说自己的理解,如果有什么错误的地方(肯定是有的。。。),轻喷。
首先,我们知道查询最好的数据结构是平衡二叉树,但是对于平衡二叉树(所有节点的左右子树高度差不超过1)。不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而旋转非常耗时的。
所以我们旋转一种不追求那么平衡的二叉树(红黑树),用相同数量的黑球间插入红球来控制各路径的相对长度不会差出一倍。
总之,红黑树就是平衡二叉树的低配版本(任何节点左腿右腿不会差一倍)。
红黑树规则
- 每个节点非红即黑
- 根节点是黑的;
- 每个叶节点(叶节点即树尾端NULL指针或NULL节点)都是黑的; 这里
- 如图所示,如果一个节点是红的,那么它的两儿子都是黑的;(黑色节点可以连续!但是数量差距需要用红色的来丑)
- 对于任意节点而言,其到叶子点树NULL指针的每条路径都包含相同数目的黑节点;(不然只能旋转替换连接)
- 每条路径都包含相同的黑节点; 弱平衡关键
通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍(因为总数量等于红+黑,黑数量是一致的,红的比黑的少),因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度低于红黑树),相对于要求严格的AVL树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,我们就用红黑树。
二叉树旋转(用来调节左右高度)
与平衡二叉树相比:
新插入节点是红色节点,所以如果父节点是黑的就直接插入了(注意这里是不管空的叶子节点的,叶子节点相当于添头),不用管别的树高