(图文结合)详细描述红黑树如何左旋、右旋

2020-03-31  本文已影响0人  时间煮菜

红黑树

首先要理解二叉查找树

二叉查找树(BST)具备什么特性呢?

  1. 左子树上所有结点的值均小于或等于它的根结点的值。

  2. 右子树上所有结点的值均大于或等于它的根结点的值。

  3. 左、右子树也分别为二叉排序树。

如下图,如果向原红黑树插入值为21的新节点,由于父节点22是红色节点,因此这种情况打破了红黑树的规则4(每个红色节点的两个子节点都是黑色),必须进行调整,使之重新符合红黑树的规则。

变换规则

  1. 变颜色的情况:当前结点的父亲是红色,且它的祖父结点的另一个子结点也是红色(叔叔结点):

    (1)把父节点设为黑色

    (2)把叔叔也设为黑色

    (3)把祖父也就是父亲的父亲设为红色(爷爷)

    (4)把指针定义到祖父结点设为当前要操作的(爷爷)分析的点变换的规则

  2. 旋:当前父结点是红色,叔叔是黑色的时候,且当前的结点是子树。左旋以父节点作为左旋

  3. 旋:当前父结点是红色,叔叔是黑色的时候,且当前的结点是子树。右旋

    (1)把父节点变为黑色

    (2)把祖父结点变为红色(爷爷)

    (3)把祖父结点旋转(爷爷)

变色

为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。

左旋转

右旋转

将要旋转的子结点的右边移到之前结点E的左边

举例说明

  1. 首先我们要插入结点6,按照二叉查找树放在如下位置。
  1. 我们发现结点6和结点7是红色的,不满足规则,下一步要判断是变色还是旋转

    当前结点的父亲是红色,且它的祖父结点的另一个子结点也是红色,我们要进行的是变色。把父节点和叔叔设为黑色,把祖父也就是父亲的父亲设为红色(爷爷)

  2. 我们发现结点5和结点12还是不满足规则。变色是说父亲结点和叔叔结点都是红色。不满足,我们用旋转。结点12位于结点5的右子树上。用左旋。

    [图片上传失败...(image-b433f8-1585661664741)]

  3. 对结点5还要进行右旋。

    (1)把父节点变为黑色

    (2)把祖父结点变为红色(爷爷)

    (3)以爷爷结点旋转

  4. 以上。上面的红黑树就没有问题了

上一篇下一篇

猜你喜欢

热点阅读