什么是红黑树
红黑树是一棵二叉搜索树,它为每一个节点增加了一个属性——颜色,其值为黑色或红色,红黑树确保从根节点到叶节点的所有路径长度差距在2倍以内,以此保证自身是近似平衡的。
红黑树是满足下面5条性质的红黑树:
- 每个节点或是黑色的,或是红色的。
- 根节点是黑色的。
- 每个叶节点(NIL)是黑色的
- 如果一个节点是红色的,则它的两个子节点都是黑色的
- 对于每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。
常规二叉树
红黑树
二叉搜索树的旋转
左旋时右孩子不为NIL,右旋时左孩子不为NIL
如果是红黑树进行左旋和右旋,那么旋转后就可能会导致新的树的不满足红黑树的某些性质,所以红黑树旋转后需要进行调整以保持性质,下面的旋转是红黑树添加节点时保持性质的关键(左旋与之类似,就不画出来了):
这种旋转加颜色修改既修复了左边结构不满足性质4的问题,又不改变其它性质,二叉树添加节点后的修复往往都是往这个结构靠拢,然后再旋转。
红黑树添加节点
新节点只会添加到根节点或叶节点(这里指常规页节点)上,假设添加节点z,若添加到某个节点的左孩子上,则在循环里重复进行以下操作直到z的父节点为黑色:
- 情况1:若z的叔叔节点为红色,则将其父亲节点和叔叔节点颜色标记为黑色,祖父节点标记为红色,让z = 祖父节点
- 情况2:若z为右孩子,则以z的父亲为轴进行左旋
- 情况3:若z为左孩子,将其父亲节点颜色标记为黑色,祖父节点颜色标记为红色,并以z的祖父为轴进行右旋。
红黑树删除节点
待续
总结
还是太菜了,看证明过程把自己绕晕了,只能大概把添加节点的流程给梳理出来了,这篇博客留待后续补充吧。