在认识红黑树之前,先来理解下二叉查找树(BST)。
二叉查找树特征:
1, 左子树上所有的节点的值均小于或等于他的根节点的值
2, 右子数上所有的节点的值均大于或等于他的根节点的值
3, 左右子树也一定分别为二叉排序树
下面为标准的二叉排序树
那问题来了,为什么一定要这种结构呢?换句话说这样的结构有什么好处呢?我们就来查找下值为10的节点。它怎么一步步的找到这个节点的?步骤是怎样的?
这不是二分查找的思想吗?确实,查找所需的最大次数等同于二叉查找树的高度。当然在插入节点的时候,也是这种思想,一层一层的找到合适的位置插入。但是二叉查找树有个比较大的缺陷,而且这个缺陷会影响到他的性能。我们先来看下有一种情况的插入操作:
如果初始的二叉查找树只有三个节点,如下图:
依次插入5个节点:7、6、5、4看下图插入之后的图:
左边变成了一条线性表,而不是树了,也就是说查找的性能大打折扣,几乎就是线性查找了。
那有没有好的办法解决这个问题呢?解决这种多次插入新节点而导致的不平衡?
红黑树
红黑树就是一种平衡的二叉查找树,说他平衡的意思是他不会变成“瘸子”,左腿特别长或者右腿特别长。除了符合二叉查找树的特性之外,还具体下列的特性:
- 节点是红色或者黑色
- 根节点是黑色
- 每个叶子的节点都是黑色的空节点(NULL)
- 每个红色节点的两个子节点都是黑色的。
- 从任意节点到其每个叶子的所有路径都包含相同的黑色节点。
“叶结点” 或"NULL结点",它不包含数据而只充当树在此结束的指示
下面为标准的红黑树,建议大家对照下面的图理解上边写的红黑树的性质
当插入和删除节点,就会对平衡造成破坏,这时候需要对树进行调整,从而重新达到平衡。那什么情况下会破坏红黑树的规则呢?
例如上面标准的红黑树,插入值为12的节点
插入之后发现仍然满足红黑树的要求!
但是如果插入值为21的节点呢?
如下图所示:
由于父节点22是红色节点,因此这种情况打破了红黑树的规则4,必须作出调整。那么究竟该怎么调整呢?主要方法包括变色和旋转(左,右)两种方式。
变色
为了符合红黑树的规则,会把节点红变黑或者黑变红。下图展示的是红黑树的部分,需要注意节点25并非根节点。因为21和22链接出现红色,不符合规则4,所以把22红变黑:
但这样还是不符合规则5,所以需要把25黑变红,看下图:
因为25和27又是两个连续的红色节点(规则4),所以需要将27红变黑。
看一下经过变色后树的全貌
由于17和25是连续的两个红色节点,那么把节点17变黑色的就打破了规则4了,而且根据规则2,也不可能把13变成红色。变色已经无法解决问题了,所以只能进行旋转了。
左旋转思想示意图如下
看下面的左旋转静态示意图
按照左旋转,对上边已经变色完成之后图进行左旋转。
规则二:根节点必须是黑色,所以需要变色,结果如下图:
规则五:从任意节点到其每个叶子的所有路径都包含相同的黑色节点。
上图17-13-8-1-6-N经过了4个黑色节点而其他都为3个
这个时候就需要右旋转了
左旋转思想示意图如下
看下面的右旋转静态示意图
接下来,对上边经过左旋转之后的图进行右旋转。
最后一个步骤 变色!
那么,这么复杂的算法,有哪些应用呢?
- 在java中Tree Map就是用的红黑树,也就是平常使用的键值对
- 在函数中实现关联数组也是用的红黑树
- 在实施计算中也有用到红黑树
- 在图像处理中的计算几何也会用到红黑树
高度
如果一颗含有n个内部节点的红黑树.它的最大高度是多少?
2lg(n+1)
其中lg是以2为底的对数
引理https://blog.csdn.net/huangyimo/article/details/81611151