按照规则,步骤如下:
3.3 左右节点旋转这种情况下,父节点是左节点,插入的节点是右节点,在旋转原始图1中,我们要插入节点67
规则如下:先父节点【左旋】,然后祖父节点【右旋】,搭配【变色】
按照规则,步骤如下:
3.4 右左节点旋转这种情况下,父节点是右节点,插入的节点是左节点,如下图(旋转原始图2)这种情况,我们要插入节点68
规则如下:先父节点【右旋】,然后祖父节点【左旋】,搭配【变色】
按照规则,步骤如下:
3.5 右右节点旋转这种情况下,父节点和插入的节点都是右节点,在旋转原始图2中,我们要插入节点70
规则如下:以祖父节点【左旋】,搭配【变色】
按照规则,步骤如下:
3.6 红黑树插入总结 无需调整 【变色】即可实现平衡 【旋转+变色】才可实现平衡情况1: 当父节点为黑色时插入子节点 空树插入根节点,将根节点红色变为黑色 父节点为红色左节点,叔父节点为黑色,插入左子节点,那么通过【左左节点旋转】
情况2: - 父节点和叔父节点都为红色 父节点为红色左节点,叔父节点为黑色,插入右子节点,那么通过【左右节点旋转】
情况3: - - 父节点为红色右节点,叔父节点为黑色,插入左子节点,那么通过【右左节点旋转】
情况4: - - 父节点为红色右节点,叔父节点为黑色,插入右子节点,那么通过【右右节点旋转】
四. 红黑树节点删除
相比较于红黑树的节点插入,删除节点更为复杂,我们从子节点是否为null和红色为思考维度来讨论。
4.1 子节点至少有一个为null当待删除的节点的子节点至少有一个为null节点时,删除了该节点后,将其有值的节点取代当前节点即可,若都为null,则将当前节点设置为null,当然如果违反规则了,则按需调整,如【变色】以及【旋转】。
4.2 子节点都是非null节点这种情况下,
第一步:找到该节点的前驱或者后继
前驱:左子树中值最大的节点(可得出其最多只有一个非null子节点,可能都为null);
后继:右子树中值最小的节点(可得出其最多只有一个非null子节点,可能都为null);
前驱和后继都是值最接近该节点值的节点,类似于该节点.prev = 前驱,该节点.next = 后继。
第二步:将前驱或者后继的值复制到该节点中,然后删掉前驱或者后继
如果删除的是左节点,则将前驱的值复制到该节点中,然后删除前驱;如果删除的是右节点,则将后继的值复制到该节点中,然后删除后继;
这相当于是一种“取巧”的方法,我们删除节点的目的是使该节点的值在红黑树上不存在,因此专注于该目的,我们并不关注删除节点时是否真是我们想删除的那个节点,同时我们也不需考虑树结构的变化,因为树的结构本身就会因为自动平衡机制而经常进行调整。