关于红黑树
红黑树的性质:
红黑树是一种自平衡的二叉查找树,它在二叉查找树的基础上又具备如下特征:
节点是红色或黑色。
根节点是黑色。
每个叶子节点都是黑色的空节点(NIL节点)。
每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
默认插入为红色(因为红色违规修复代价小) 如果违规 要进行违规修复 (1)变色(2)旋转(左旋或者右旋)
红黑树插入:
情况1:原树是空树,违背了根节点是黑色=》直接把该节点涂成黑色
情况2:插入节点的父节点是黑色,没有破坏红黑树。无需调整。
情况3:当前节点的父节点是红色且叔叔节点也是红色。
分析:此时父节点的父亲一定存在否则插入前已经违背了红黑树原则,此时又分为父节点是祖父节点的左子树还是右子树。对于对称性,我们只要解开一个方向就可以了。在此,目前我们只考虑父节点再祖父节点的左侧。同时还可以分为当前节点在父节点的左侧还是右侧。但是处理方式还是一样的,我们将归为一类。
解决方法:(变色解决)将当前节点的父节点和叔叔节点变为黑色,祖父节点变为红色,以祖父节点为新的当前节点,重新开始新的解决方法。
情况4:当前节点的父节点是红色,叔叔节点是黑色,当前节点是父节点的右侧,当前节点的父节点作为新的当前节点。以新的当前节点为支点进行左旋。
情况5:当前节点的父节点为红色,叔叔节点是黑色,当前节点是父节点的左侧。
父节点变为黑色,祖父节点变为红色,在以祖父节点为支点进行一次右旋。
何时变色、左旋、何时右旋:
(1)当前节点的父节点为红色,叔叔节点也为红色则先进行一下变色处理。
(2)当前节点的父节点为红色,叔叔节点为黑色,如当前节点再父节点的左侧进行右旋
处理。如当前节点再父节点的右侧需进行左旋处理。
(3)左旋是当前节点的父节点为支点 右旋是以他的父节点为支点。
右旋时候会有个变色的时候将当前节点的父节点变为黑色祖父节点变为红色。以变色后的红色祖父节点为支点旋转
插入前:
插入后:违背了红黑树原则(不能有两个相邻的红色)
由于违背了红黑树原则此时需要对红黑树进行调整:当前节点的父节点和叔叔节点都为红色,首先先进行一次变色处理。
(1)将父节点5 变为黑色,
(2)叔叔节点8变为黑色,
(3)祖父节点7变为红色。
变色处理后还是违背红黑树的原则:此时7为新的当前节点,他的父节点为红色,叔叔节点为黑 色此时需要自选来维护红黑树的原则。当前节点再父节点的右侧此时可进行左旋处理。
此时可以根据情况4 以新的节点7的父节点2为支点进行一次左旋。
左旋后还是违背红黑树的原则
情况5:当前节点的父节点为红色,叔叔节点是黑色,当前节点是父节点的左侧。
父节点变为黑色,祖父节点变为红色,在以祖父节点为支点进行一次右旋。
旋转后符合红黑树的原则这样就完成了。