码迷,mamicode.com
首页 > 其他好文 > 详细

红黑树

时间:2015-06-08 21:29:12      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

1.性质

  红黑树是一种二叉查找树,但是每个节点增加一个表示结点颜色(红或黑)的字段,并且满足一下条件:

  • 每个节点或是红的,或是黑的
  • 根节点是黑的
  • 每个叶结点(NIL)是黑的
  • 如果一个节点是红的,则它的两个儿子都是黑的
  • 对每个节点,从该结点到其子孙节点的所有路径上包含相同数目的黑节点

  为方便处理边界条件,我们采用一个哨兵来表示NIL,如果某节点没有一个子结点或父结点,则该结点的相应指针指向NIL。

  一棵有n个内结点(不包括NIL)的红黑树高度之多为2lg(n+1)。

2.旋转

  在红黑树上执行插入或删除操作时,结果都可能违反红黑树的性质,我们需要改变树的指针结构来保持红黑树的性质。旋转是修正过程中会用到的操作,分为左旋和右旋,这里只介绍左旋操作,右旋刚好与左旋操作相反。下面是旋转的示意图

  技术分享

LEFT-ROTATE(T, x)
    y ← right[x]
    right[x] ← left[x]

    if left[y] != nil[T]
        p[left[y]] ← x

    p[y] ← p[x]

    if p[x] = nil[T]
        root[T] ← y
    else if x = left[p[x]]
        left[p[x]] ← y
    else right[p[x]] ← y
    
    left[y] ← x
    p[x] ← y

3.插入

  插入操作与普通二叉树的插入操作接近,将新插入节点设置为红色(尽可能少违反二叉树性质),并在最后增加RB-INSERT-FIXUP(T, z)调节二叉树使其满足红黑树的性质。

RB-INSERT
    y ← nil[T]
    x ← root[T]
    while x != nil[T]
        do y ← x
        if key[z] < key[x]
            x ← left[x]
        else x ← right[x]
    p[z] ← y
    if y = nil[T]
        root[T] = z
    else if key[z] < key[y]
        left[y] ← z
    else
        right[y] ← z
    left[z] ← nil[T]
    right[z] ← nil[T]
    color[z] ← RED
    RB-INSERT-FIXUP(T, z)

 

红黑树

标签:

原文地址:http://www.cnblogs.com/yitong0768/p/4561825.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!