什么是红黑树
红黑树也是一颗二叉搜索树
图上有几条路径呢?
11条路径,根到空节点算一条路径
红黑树能做到最长路径不超过最短路径的2倍,达到近似平衡
也就是说AVL树的最小高度差为什么非得是1,2/3…行不行?
红黑树认为AVL树太严格控制平衡了,旋转的过程是要付出代价的。
但你要控制高度超2/3很难去控制,红黑树通过颜色控制而不是高度差。
红黑树的性质
- 每个结点不是红色就是黑色
- 根节点是黑色的
- 如果一个节点是红色的,则它的两个孩子结点是黑色的 (任何路径没有连续的红色节点,但是允许有连续的黑色节点且满足路径黑色节点数相同的条件下)
- 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点 (直接从根节点往下看,每条路径上黑色节点的数量相等)
- 每个叶子结点都是黑色的(此处的叶子结点指的是空结点) (只是为了更好的帮助我们理解路径的概念)
这几点规则是互斥的。
控制住这几条性质,我们就控制住了红黑树最长路径不超过最短路径的2倍,就控制住了红黑树达到近似平衡。
红黑树如何控制高度差不超过最短的2倍 ?
依照这几条互斥的规则控制树的高度,而且插入过程中是会旋转的。
按这颗树来举例估算AVL树和红黑树之间的性能差距,为什么说红黑树反而更优呢?
极限情况下
最短路径会是全黑的
最长路径 只能往黑的里面塞红的,塞黑的就会与性质4冲突,则最长路径就是一黑一红相间的路径,还只能塞一个红,两个红会违反性质3.
我们大概估算,把所有黑节点都拿出来会是一颗近似完全二叉树。
如果AVL树一共有1000个节点,红黑也有1000个
把红黑所有的黑节点拿出来就按1000算高度h=logn = 10
红黑树最长路径是最短的2倍,h = 20
这里就简单理解为红黑树的操作高度次是AVL的操作高度次的2倍,在CPU看来没什么区别。
红黑树实现
红黑树的节点也需要三叉链,并且需要颜色枚举
插入
红黑树的插入,因为红黑树也是二叉搜索树,所以前半部分插入逻辑和搜索树一样,但需要引入颜色控制。
我们插入一个新节点,我们插入红的还是黑的呢?
我们讲的性质最重要的是3 和 4,你要插入新节点注定要违反规则
如果插入黑色节点,这是很不理性的,它破坏了性质4,破坏了每条路径上黑色节点数量相等,你还要去每条路径上去补黑色节点吗?
所以要插入红色节点,它不会影响其他路径,但是可能会影响当前路径。比如右边规则3就被违反了,但是左边插入到黑色节点下刚刚好。
插入红节点如果父亲是红那一定存在爷爷节点且是黑色,则这种情况不可能没有爷爷。
黑色节点多是有好处的,方便红色的直接插入
首先看parent的颜色
黑
结束
红
再看叔叔
这里又分为父亲是爷爷的左 or 爷爷的右
以左为例子,看叔叔,如果叔叔存在且为红,那么变色 + 继续向上处理。
如果叔叔不存在 或 存在且为黑,那么要根据 爷爷 父亲 和 当前cur节点(它可能是被下面变色引发的 也可能就是新插入节点)的位置关系来判断是 单旋 还是 双旋,旋转平衡以后需要维护颜色关系变化,让中间节点是黑色,其他两个是红色。
如果父亲是爷爷的右,那么就反过来。