红黑树(Red-Black Tree)

  • 红黑树是一种BST,但是每个节点上增加一个存储位表示该节点的颜色(R或者B);通过对任何一条从root到leaf的路径上节点着色方式的显示,红黑树确保所有路径的差值不会超过一倍,最终使得BST接近平衡;
  • 红黑树内每个节点包含五个属性:color, key, left, right和p,p表示指向父亲节点的指针;一棵BST需要同时满足下述五个性质才能称作红黑树:

    每个节点只能是红色或者黑色节点中的一种;

    根节点必须是黑色;

    每个叶节点(NULL)必须是黑色;

    如果一个节点是红色,则它的两个子节点必须是黑色;

    对于树中任何一个节点,该节点到其叶节点的所有路径上的黑色节点数相同

  • 红黑树的空间复杂度为O(N);支持三种操作:search, insert, delete,并且所有操作的时间复杂度都为O(logN),最好情况跟最坏情况的复杂度相同。对于search操作而言,其依赖BST的性质,所以不需 要依赖节点的着色信息;着色信息仅为了保证BST的平衡性,insert和delete操作则可能破坏BST的平衡性,所以这两种操作需要对红黑树中节点 的着色信息进行调整。
     
  1. //左旋操作中,oldroot的右子节点成为新的root,root的左子节点成为oldroot的右子节点,
  2. //oldroot成为新root的左子节点
  3. template <class KeyType>
  4. void Node<KeyType>::RotateLeft(Node<KeyType> * & root) {
  5. Node<KeyType> * oldRoot = root;
  6. root = root->mySubtree[RIGHT];
  7. oldRoot->mySubtree[RIGHT] = root->mySubtree[LEFT];
  8. root->mySubtree[LEFT] = oldRoot;
  9. }
  10.  
  11. //右旋操作中,oldroot的左子节点成为新的root,root的右子节点成为oldroot的左子节点,
  12. //oldroot成为新root的右子节点
  13. template <class KeyType>
  14. void Node<KeyType>::RotateRight(Node<KeyType> * & root) {
  15. Node<KeyType> * oldRoot = root;
  16. root = root->mySubtree[LEFT];
  17. oldRoot->mySubtree[LEFT] = root->mySubtree[RIGHT];
  18. root->mySubtree[RIGHT] = oldRoot;
  19. }
  20.  
  21. //向T索引的红黑树中插入新节点z,使用BST的性质查找z的插入位置,并且将新节点z标
  22. //注为红色;
  23. RB-INSERT(T, z)
  24. y nil[T]
  25. x root[T]
  26. while x nil[T]
  27. do y x
  28. if key[z] < key[x]
  29. then x left[x]
  30. else x right[x]
  31. p[z] y
  32. if y = nil[T]
  33. then root[T] z
  34. else if key[z] < key[y]
  35. then left[y] z
  36. else right[y] z
  37. left[z] nil[T]
  38. right[z] nil[T]
  39. color[z] RED
  40. RB-INSERT-FIXUP(T, z)

插入一个节点并标注为红色的操作可能破坏红黑树的性质2和性质4;当插入节点为根节点的时候破坏性质2,此时直接将其变成黑色就可以恢复;当破坏性质4的时候则需要一系列的恢复操作;
case1:原树为空,新节点为根节点;恢复策略为将其改成黑色;
case2:新节点的父节点是黑色;满足所有红黑树规则;
case3:新节点的父节点是红色,父节点的兄弟节点是红色;恢复策略为将新节点的父节点和父节点的兄弟节点改成黑色,其祖父节点改成红色,针对祖父节点重新调用该方法;
case4:新节点的父节点是红色,父节点的兄弟节点是黑色,新节点为父节点的右子;恢复策略为以新节点的父节点为支点左旋;
case5:新节点的父节点是红色,父节点的兄弟节点是黑色,新节点为父节点的左子;恢复策略为将新节点的父节点改成黑色,祖父节点改成红色,并以祖父节点为支点右旋;

  1. RB-INSERT-FIXUP(T, z)
  2. while color[p[z = RED
  3. do if p[z] = left[p[p[z]]
  4. then y right[p[p[z]]
  5. if color[y] = RED
  6. then color[p[z BLACK Case
  7. color[y] BLACK Case
  8. color[p[p[z]] RED Case
  9. z p[p[z Case
  10. else if z = right[p[z
  11. then z p[z] Case
  12. LEFT-ROTATE(T, z) Case
  13. color[p[z BLACK Case
  14. color[p[p[z]] RED Case
  15. RIGHT-ROTATE(T, p[p[z]) Case
  16. else (same as then clause with "right" and "left" exchanged)
  17. color[root[T BLACK
  18.  
  19. //
  20. RB-DELETE(T, z)
  21. if left[z] = nil[T] or right[z] = nil[T]
  22. then y z
  23. else y TREE-SUCCESSOR(z)
  24. if left[y] nil[T]
  25. then x left[y]
  26. else x right[y]
  27. p[x] p[y]
  28. if p[y] = nil[T]
  29. then root[T] x
  30. else if y = left[p[y
  31. then left[p[y x
  32. else right[p[y x
  33. if y z
  34. then key[z] key[y]
  35. copy y's satellite data into z
  36. if color[y] = BLACK
  37. then RB-DELETE-FIXUP(T, x)
  38. return y

case1:x的兄弟w是红色
case2:x的兄弟w是黑色,并且w的两个孩子是黑色
case3:x的兄弟w是黑色,并且w的左孩子是红色,w的右孩子是黑色
case4:x的兄弟w是黑色,并且w的右孩子是红色

  1. RB-DELETE-FIXUP(T, x)
  2. while x root[T] and color[x] = BLACK
  3. do if x = left[p[x
  4. then w right[p[x
  5. if color[w] = RED
  6. then color[w] BLACK Case
  7. color[p[x RED Case
  8. LEFT-ROTATE(T, p[x]) Case
  9. w right[p[x Case
  10. if color[left[w = BLACK and color[right[w = BLACK
  11. then color[w] RED Case
  12. x p[x] Case
  13. else if color[right[w = BLACK
  14. then color[left[w BLACK Case
  15. color[w] RED Case
  16. RIGHT-ROTATE(T, w) Case
  17. w right[p[x Case
  18. color[w] color[p[x Case
  19. color[p[x BLACK Case
  20. color[right[w BLACK Case
  21. LEFT-ROTATE(T, p[x]) Case
  22. x root[T] Case
  23. else (same as then clause with "right" and "left" exchanged)
  24. color[x] BLACK

笔试算法题(51):简介 - 红黑树(RedBlack Tree)的更多相关文章

  1. [Data Structure] 红黑树( Red-Black Tree ) - 笔记

    1.  红黑树属性:根到叶子的路径中,最长路径不大于最短路径的两倍. 2. 红黑树是一个二叉搜索树,并且有 a. 每个节点除了有左.右.父节点的属性外,还有颜色属性,红色或者黑色. b. ( 根属性 ...

  2. [转]SGI STL 红黑树(Red-Black Tree)源代码分析

    STL提供了许多好用的数据结构与算法,使我们不必为做许许多多的重复劳动.STL里实现了一个树结构-Red-Black Tree,它也是STL里唯一实现的一个树状数据结构,并且它是map, multim ...

  3. 红黑树red-black tree

    书籍:<算法导论>第13章 红黑树性质:1. 每个节点要么red要么black.2. 根节点是black节点.3. 叶子节点是black节点.4. red节点的左右儿子节点都是black节 ...

  4. 红黑树(Red-Black Tree),B树,B-树,B+树,B*树

    (一)红黑树(Red-Black Tree) http://www.cnblogs.com/skywang12345/p/3245399.html#a1 它一种特殊的二叉查找树.红黑树的每个节点上都有 ...

  5. 红黑树( Red-Black Tree ) - 笔记

    1.  红黑树属性:根到叶子的路径中,最长路径不大于最短路径的两倍. 2. 红黑树是一个二叉搜索树,并且有 a. 每个节点除了有左.右.父节点的属性外,还有颜色属性,红色或者黑色. b. ( 根属性  ...

  6. 红黑树(Red-Black Tree)

    概念解析: 红黑树是一种自平衡二叉查找树(self-balancing binary search tree).因此,红黑树本身就是二叉树的一个变种.典型的用途是实现关联数组(Associative ...

  7. 手撸红黑树-Red-Black Tree 入门

    一.学习红黑树前的准备: 熟悉基础数据结构 了解二叉树概念 二.红黑树的规则和规则分析: 根节点是黑色的 所有叶子节点(Null)是黑色的,一般会认定节点下空节点全部为黑色 如果节点为红色,那么子节点 ...

  8. 笔试算法题(47):简介 - B树 & B+树 & B*树

    B树(B-Tree) 1970年由R. Bayer和E. Mccreight提出的一种适用于外查找的树,一种由BST推广到多叉查找的平衡查找树,由于磁盘的操作速度远小于存储器的读写速度,所以要求在尽量 ...

  9. Java数据结构和算法(十一)——红黑树

    上一篇博客我们介绍了二叉搜索树,二叉搜索树对于某个节点而言,其左子树的节点关键值都小于该节点关键值,右子树的所有节点关键值都大于该节点关键值.二叉搜索树作为一种数据结构,其查找.插入和删除操作的时间复 ...

随机推荐

  1. [App Store Connect帮助]七、在 App Store 上发行(2.1)设定价格与销售范围:为您的 App 设定价格

    在您提交 App 以供审核之前,您必须为您的 App 设定一个价格,该价格将用于 App Store 的所有地区.如果您没有<付费应用程序协议>,则只能选择免费. 必要职能:“帐户持有人” ...

  2. Pycharm安装及第一次使用导航

    Pycharm:Pycharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管理.代码跳转.智能提示.自动完成.单元 ...

  3. AutoCAD2012启动错误 1308 源文件未找到

    启动AutoCAD2012时,弹出错误1308,如图所示: 是何原因? 对CAD的运行有何影响?

  4. Django中的cookie和session实现

    cookie from django.shortcuts import render, HttpResponse, redirect # 此装饰器的作用就是讲所有没有cookie验证的页面都需要验证后 ...

  5. Python生成器实现斐波那契数列

    比如,斐波那契数列:1,1,2,3,5,8,13,21,34.... 用列表生成式写不出来,但是我们可以用函数把它打印出来: def fib(number): n, a, b = 0, 0, 1 wh ...

  6. [POI2007]旅游景点atr

    Description FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之 ...

  7. Triangular Pastures POJ - 1948

    Triangular Pastures POJ - 1948 sum表示木条的总长.a[i]表示第i根木条长度.ans[i][j][k]表示用前i条木条,摆成两条长度分别为j和k的边是否可能. 那么a ...

  8. WinForm 里面关闭窗体的两个方法的区别 Form.coles()与Application,Exit()

  9. DB buffer bussy wait 分析一例

    ####sample 1: DB层分析OI DB层分析OI的信息如下: 1. 异常时间段,  Logical reads:/ Physical reads/ Physical write  指标都低于 ...

  10. 5 月编程语言排行榜:Java第一,R跌出Top20

    我们都知道,最近,TIOBE 发布了 5 月份编程语言排行榜.其中,前三名依然健稳不变,他们分别是 Java.C.C++,第四则为: Python ,第五则为 VB .NET. 下面两张图,我们可以看 ...