zoukankan      html  css  js  c++  java
  • 红黑树

    红黑树

    概述

    红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由鲁道夫•贝尔发明的,他称之为"对称二叉B树",它现代的名字是在Leo J. Guibas和Robert Sedgewick于1978年写的一篇论文中获得的。

    五个性质

    红黑树的五个性质:

    1. 每个结点或是红色的,或是黑色的。
    2. 根结点是黑色的。
    3. 每个叶结点(NIL)是黑色的。
    4. 如果一个结点是红色的,则它的两个子结点都是黑色的。
    5. 对每个结点,从该结点到其所有叶子结点的简单路径上,均包含相同数目的黑色结点。

    插入

    按照BST的规则增加结点并标记它为红色,为什么是红色呢?原因如下:

    • 若设置为黑色,就会导致根到叶子的路径上有一条路径上多了一个黑色结点,很难调整(性质5)。
    • 设置为红色结点后,可能会导致出现两个连续红色结点的冲突,那么可以通过颜色调换和数旋转来调整(性质4)。

    1.新结点位于树根

    新节点位于树根,直接变为黑色即可。

    2.新结点的父结点为黑色(黑父)

    该条件下,插入一个红色结点不会影响红黑树的平衡。

    • 新增结点为红色的,任何一条简单路径都没有增加黑色结点的个数。
    • 该种情况较为常见,从而使得红黑树需要旋转调整的几率相对AVL树少一些。

    3.新结点的父结点为红色(红父)

    新结点的父结点是红色,祖父结点一定是黑色,需要根据叔叔结点来决定进行什么样的操作。

    叔叔结点也是红色

    • 祖父结点变为红色。
    • 父结点变为黑色。
    • 叔叔结点变为红色。

    叔叔结点为黑色或者没有叔叔

    情形1:新结点N为父结点P的右孩子,而P是其父结点的左孩子
    • 进行先左再右旋转。
    • 新结点变为黑色,祖父结点变为红色。

    情形2:新结点N是父结点的左孩子,P是父结点的右孩子
    • 进行先右再左旋转。
    • 新结点变为黑色,祖父结点变为红色。

    情形3:新结点N和父结点P都是左孩子
    • 进行右旋转。
    • 父结点变为黑色,祖父结点变为红色。

    情形4:新结点N和父结点P都是右孩子
    • 先进行左旋转。
    • 父结点变为黑色,祖父结点变为红色。

    以上四种旋转结束后,根均为黑色,不需要向上继续进行平衡操作。

     
  • 相关阅读:
    gbin1分享: jQuery UI 1.9带给我们的惊喜
    7个优秀的javascript资源
    转载:仅需78美元,你就能拥有一个iPhone机器人Romo
    GBin1推荐:使用时间轴插件Timelinr创建超酷jQuery时间轴(Time line)
    GBin1分享:10个帮助你精通Firebug控制台的技巧
    GBin1分享:jQuery1.7 Beta 预览
    批处理文件安装卸载window服务程序的技巧
    当前不会命中断点 还没有为该文档加载任何符号
    HttpModule,HttpHandler,HttpHandlerFactory简单使用
    VS2010 .net Windows服务程序 重复性 注册反注册
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/6687653.html
Copyright © 2011-2022 走看看