红黑树

作者: edolovee | 来源:发表于2018-03-14 16:28 被阅读0次

定义

红黑树是一个平衡的二叉树,其满足如下性质:

  1. 节点是红色或者是黑色
  2. 根节点是黑色
  3. 每个叶节点是黑色
  4. 每个红色节点的两个子节点都是黑色的
  5. 从根节点到任何叶子节点经过的黑色几点数相同

保持平衡的操作

  1. 左旋
    比如对A左旋,则操作如下:
  • 将A的右节点赋值为C,更新C的父节点为A
  • 将B的父节点赋值为A的父节点,更新A的父节点的孩子为B
  • 将B的左节点赋值为A,更新A的父节点为B
image.png
  1. 右旋
    比如对A右旋,则操作如下:
  • 将A的左子节点赋值为C,更新C的父节点为A
  • 将B的父节点赋值为A的父节点,更新A的父节点的孩子为B
  • 将B的右子节点赋值为A,更新A的父节点为B


    image.png

保持平衡情况分析

  1. 插入
  • 当前节点的父节点是祖父节点的左孩子,叔叔节点是红色,则叔叔节点、父节点设置为黑,祖父节点设置为红,当前节点设置为祖父节点

  • 当前节点的父节点是祖父节点的左孩子,叔叔节点是黑色,当前节点为右孩子则以父节点左旋,当前节点设置为父节点

  • 当前节点的父节点是祖父节点的左孩子,叔叔节点是黑色,当前节点为左孩子则将父节点设置为黑,祖父节点设置为红,以祖父节点右旋

  • 当前节点的父节点是祖父节点的右孩子,叔叔节点是红色,则叔叔节点、父节点设置为黑,祖父节点设置为红,当前节点设置为祖父节点

  • 当前节点的父节点是祖父节点的右孩子,叔叔节点是黑色,当前节点为左孩子则以父节点右旋,当前节点设置为父节点

  • 当前节点的父节点是祖父节点的右孩子,叔叔节点是黑色,当前节点为右孩子则将父节点设置为黑,祖父节点设置为红,以祖父节点左旋

代码实现参考TreeMap的实现

private void fixAfterInsertion(Entry<K,V> x) {
    x.color = RED;
    while (x != null && x != root && x.parent.color == RED) {
        if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
            Entry<K,V> y = rightOf(parentOf(parentOf(x)));
            if (colorOf(y) == RED) {//如果y为null,则视为BLACK
                setColor(parentOf(x), BLACK);              // 情况1
                setColor(y, BLACK);                        // 情况1
                setColor(parentOf(parentOf(x)), RED);      // 情况1
                x = parentOf(parentOf(x));                 // 情况1
            } else {
                if (x == rightOf(parentOf(x))) {
                    x = parentOf(x);                       // 情况2
                    rotateLeft(x);                         // 情况2
                }
                setColor(parentOf(x), BLACK);              // 情况3
                setColor(parentOf(parentOf(x)), RED);      // 情况3
                rotateRight(parentOf(parentOf(x)));        // 情况3
            }
        } else {
            Entry<K,V> y = leftOf(parentOf(parentOf(x)));
            if (colorOf(y) == RED) {
                setColor(parentOf(x), BLACK);              // 情况4
                setColor(y, BLACK);                        // 情况4
                setColor(parentOf(parentOf(x)), RED);      // 情况4
                x = parentOf(parentOf(x));                 // 情况4
            } else {
                if (x == leftOf(parentOf(x))) {
                    x = parentOf(x);                       // 情况5
                    rotateRight(x);                        // 情况5
                }
                setColor(parentOf(x), BLACK);              // 情况6
                setColor(parentOf(parentOf(x)), RED);      // 情况6
                rotateLeft(parentOf(parentOf(x)));         // 情况6
            }
        }
    }
    root.color = BLACK;
}

应用以及 性能

linux的虚拟内存管理以及java中的treeset和treemap,其时间复杂度在O(lgn),此外,任何不平衡都会在3次旋转之内解决。这一点是AVL所不具备的。

相关文章

  • 数据结构—树—红黑树

    红黑树概述 红黑树的插入 红黑树的删除

  • TreeMap

    需要先了解红黑树,这是之前分析红黑树的文章。之前在分析红黑树时,我认为红黑树=二叉查找树+红黑平衡,关于二叉查找树...

  • 数据结构与算法-AVL 红黑树

    AVL树AVL树 算法红黑树红黑树 B站

  • [转载]红黑树

    https://zhuanlan.zhihu.com/p/24367771红黑树简介红黑树插入红黑树删除

  • 拿下红黑树

    红黑树 红黑树、2-3树的简单定义: 实现红黑树的基本结构以及添加操作(维护定义,左旋、右旋、颜色反转) 红黑树与...

  • 红黑树

    啥是红黑树,红黑树 = 二叉树

  • 彻底理解红黑树(二)之 插入

    彻底理解红黑树(一)之 二叉搜索树彻底理解红黑树(二)之 插入彻底理解红黑树(三)之 删除 前言 红黑树的插入情况...

  • 彻底理解红黑树(三)之 删除

    彻底理解红黑树(一)之 二叉搜索树彻底理解红黑树(二)之 插入彻底理解红黑树(三)之 删除 前言 红黑树的删除情况...

  • Golang红黑树

    红黑树 红黑树是每个节点都带有颜色属性(红色或黑色)的二叉查找树。红黑树也属于自平衡二叉查找树。 红黑树具有如下性...

  • 数据结构红黑树添加、修改原理分析

    源码分析大纲 数据结构解析 红黑树试下原理刨析 数据结构解析 1.红黑树 1.1 红黑树概念 红黑树(Red Bl...

网友评论

      本文标题:红黑树

      本文链接:https://www.haomeiwen.com/subject/zyttqftx.html