红黑树是满足一定条件的二叉树。
其实并不是多么高深的数据结构。只要记得,红黑树和平衡二叉树,都是具有特殊性质的二叉树就可以了。
在平衡二叉树中,插入了新节点,需要调整树以保证满足平衡条件【左右子树高度差不超过1】,那么红黑树在插入新节点之后,也需要调整以满足红黑树的一下条件:
1、每个节点不是红色就是黑色。
2、根节点为黑色。
3、红节点的子节点必须是黑色。
4、任一节点至NULL(树尾端)的每一条路径上,所含黑节点的数目必须相同。
红黑树并不要求左右子树高度差控制在1以内,它的平衡条件比AVL树弱。然而红黑树通常能够导致良好的平衡状态,经验告诉我们,红黑树的平均搜索效率和AV-tree几乎相等,但是其插入节点的开销相对较低,实践中发生旋转的次数相对较少。
以下所有操作,在新插入节点后,首先将新节点设为红色【如果直接插入黑色,那么一条路径上黑色节点的个数就发生变化了】。如果待插入节点要插入到黑色节点之下,那么就可以直接插入,不用其他处理。如果待插入节点的父节点是红色,那么需要做一些处理以保持红黑树的性质。
如果新点的父结点为黑色结点,那么插入一个红点将不会影响红黑树的平衡,此时插入操作完成。红黑树比AVL树优秀的地方之一在于黑父的情况比较常见,从而使红黑树需要旋转的几率相对AVL树来说会少一些。
如果新点的父结点为红色,这时就需要进行一系列操作以保证整棵树红黑性质。如图3所示,由于父结点为红色,此时可以判定,祖父结点必定为黑色。这时需要根据叔父结点的颜色来决定做什么样的操作。青色结点表示颜色未知。由于有可能需要根结点到新点的路径上进行多次旋转操作,而每次进行不平衡判断的起始点(我们可将其视为新点)都不一样。所以我们在此使用一个蓝色箭头指向这个起始点,并称之为判定点。
当叔父结点为红色时,如图4所示,无需进行旋转操作,只要将父和叔结点变为黑色,将祖父结点变为红色即可【是为了保持在一个到叶子节点的路径中,黑色节点的数目相同这个属性。因为经过父和叔的路径,必然要经过祖。这样经过父和叔的路径上,黑色节点的数目就没有改变】。但由于祖父结点的父结点有可能为红色,从而违反红黑树性质。此时必须将祖父结点作为新的判定点继续向上进行平衡操作。
需要注意,无论“父”在“叔”的左边还是右边,无论“新”是“父”的左孩子还是右孩子,它们的操作都完全一样。
当叔父结点为黑色时,需要进行旋转,以下图示了所有的旋转可能
情形1:
情形2:
情形3:与情形1类似
情形4:与情形2类似
上面两个情形,是在树的左侧插入节点。在右侧插入节点图片正好与之相反。
------------------------------------------------------------------------
删除操作比较复杂,没仔细看。