数据结构与算法之美_26_红黑树(下):掌握这些技巧,你也可以实现一个红黑树
上一节,我们讲到红黑树定义的时候,提到红黑树的叶子节点都是黑色的空节点。这是为了代码实现方便,那更加确切的原因是什么呢? 实现红黑树的基本思想 魔方的复原解法是有固定的算法的:遇到那几面是什么样子,对应就怎么转几下。只要跟着这个复原步骤,就肯定能将魔方复原。 实际上,红黑树的平衡过程跟魔方复原非常神似,大致过程就是:遇到什么样的节点排布,我们就对应怎么去调整。只要按照这些固定的调整规则来操作,就能将一个非平衡的红黑树调整成平衡的。 我们再回顾下红黑树需要满足的几个要求: 根节点是黑色的; 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据; 任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的; 每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点。 在插入,删除节点的过程中,第三、第四点要求可能会被破坏,而我们今天要讲的“平衡调整”,实际上就是要把被破坏的第三、第四点恢复过来。 在正式开始之前,我们先介绍两个非常重要的操作,左旋(rotate left)、右旋(rotate right)。 左旋全称其实是叫围绕某个节点的左旋,那右旋的全称就是围绕某个节点的右旋。 下面讲的平衡调整中,会一直用到这两个操作,下图所示就是这两个操作的示意图,图中的 a、b、r表示子树,可以为空。 前面说了,红黑树的插入、删除操作会破坏红黑树的平衡