MIT算法导论十 平衡搜索树一

平衡搜索树(BST),所有操作的Θ(lgn)
(平衡树有可能不是二叉树,这一节只讨论二叉树的情况)

有多重平衡树结构
- AVL trees
- 2-3 trees
- 2-3-4 trees
- B trees
- Red-black trees
- Skip lists
- Treaps


红黑树 Red-black trees

BST的一种
- 每个结点有一个色域,要么为黑结点,要么为红结点
- 根节点和叶子结点都为黑结点
- 每个红结点的父亲都为黑结点,即不可能出现两个红色结点相连的情况
- 从根节点到任意叶节点的路径中的黑色结点数目相等,这个数目也称为黑高度

由以上性质,可以保证红黑树的高度为O(lgn)

Example.


证明

将红黑树的所有红结点,都与其父节点(黑)合并,可以得到一颗2-3-4 tree(即每个结点的子节点数目为2~4个)
并且所有节点的高度都是黑节点的高度,也就是所有叶子节点有相同的深度,意味着树是平衡的

假设整棵树高度为h,那么叶子结点数应为h2~h4
原红黑树的叶子结点个数为带键值结点个数n+1(平衡树叶子节点的数量总是内部节点的数量加1)
leaf = n+1 | n是key的数量
=> h'2 <= n+1 <= h'4
=> h' <= lg n+1
树最高情况是红黑相间的时候,因此其高度最高只有h <= 2h' <= 2lg n+1
树的高度为O(lgn)

树操作

红黑树的查询操作和普通BST一样,删除和插入操作则相对复杂
我们要保证红黑树的性质,因为这些性质是红黑树为平衡树的保证,能够保证红黑树的高度为Olgn,这样红黑树的基本操作都可以保证在O(lgn)的时间复杂度内完成

为了保持红黑性需要三种操作
- BST操作
- 改变节点颜色
- 利用旋转改变节点关系

旋转
保持二叉搜索树的性质,并且只需要常数时间

α<X<β<Y<γ

LEFT_ROTATE(T,x)
   y = right[x]           //获取右孩子
   rihgt[x] = left[y]     //设置x的右孩子为y的左孩子
   if left[y] != NIL
       then parent[left[x]] = x
    parent[y] = parent[x]  //设置y的父节点为x的父节点
    if parent[x] == NIL
       then root[T] = y
       else if x==left[parent[x]
              then left[parent[x]] = y
              else  right[[parent[x]] = y
    left[y] = x            //设置y的左孩子为x
    parent[x] =y

插入
插入一个新结点的过程是在二叉查找树插入过程的基础上改进的,先按照二叉排序的插入过程插入到红黑树中,然后将新插入的结点标记为红色(插入黑色会影响树的深度,很容易破坏红黑性质,标记红色只可能影响性质3)。然后调整结点并重新着色,使得满足红黑树的性质。

Insert

如果每次插入新的结点z导致红黑树性质被破坏,最多只有一个性质被破坏,并且不是性质2就是性质4。违反性质2是因为z是根且为红色,只需要改变跟节点的颜色,违反性质4是因为z和其父节点parent[z]都是红色的。

以下分析的大前提是z的父结点是红色,建立在z的父结点是左孩子基础上(相反情况类似,不做分析)

插入后有多种情况
情况1:z的叔叔结点y是红色的
此时父节点parent[z] A和叔叔节点y D都是红色的,解决办法是将z的父节点parent[z] A和叔叔结点y D都变为黑色,将z的祖父结点parent[parent[z]] C变为红色,然后从祖父结点parent[parent[z]] C继续向上判断是否破坏红黑树的性质

Case1

情况2:z的叔叔y是黑色的,而且z是右孩子
情况3:z的叔叔y是黑色的,而且z是左孩子

情况2和情况3中叔叔节点y D都是黑色的,通过z是左孩子还是右孩子进行区分的。可以将情况2通过旋转为情况3。情况2中z是右孩子,旋转后成为情况3,使得z变为左孩子,可以在parent[z]结点出使用一次左旋转来完成。
无论是间接还是直接的通过情况2进入到情况3,z的叔叔y总是黑色的。在情况3中,将父节点parent[z] B着为黑色,祖父节点parent[parent[z]] C着为红色,然后从祖父节点parent[parent[z]] C处进行一次右旋转。

Case2和Case3
RB_INSERT(T,z)
  y = NIL
  x =root(T)
  while x != NIL
       do y=x
           if key[z]<key[x]
             then x=left[x]
             else  x=right[x]
  parent[z] = y
  if y =NIL
     then root =z
     else if key[z] < key[y]
            then left[y] =z
            else  right[y] =z
   left[z] = NIL
   right[z] =NIL
   color[z] = RED          //新插入结点标记为红色
   RB_INSERT_FIXUP(T,z)    //进行调整,使得满足红黑树性质
RB_INSERT_FIXUP(T,z)
  while color[parent[z]] = RED
      do if parent[z] == left[parent[parent[z]]]
            then y = right[parent[parent[z]]]
                if color[y] == RED    //情况1,z的叔叔为红色
                   then color[parent[z]] = BLACK
                        color[y] = BLACK
                        color[parent[parent[z]]=RED 
                        z= parent[parent[z]]
                else if z == right[parent[z]]    //情况2,z的叔叔为黑色,z为右孩子
                        then z = parent[z]
                             LEFT_ROTATE(T,z)
                color[parent[z]]=BLACK    //情况3,z的叔叔为黑色,z为左孩子
                color[parent[parent[z]] = RED
                RIGHT_ROTATE(T, parent[parent[z]])
      else (same as then clause with “right” and “left” exchanged)
color(root(T)) = BLACK; //将根结点设置为黑色
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,763评论 6 539
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,238评论 3 428
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,823评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,604评论 1 317
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,339评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,713评论 1 328
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,712评论 3 445
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,893评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,448评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,201评论 3 357
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,397评论 1 372
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,944评论 5 363
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,631评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,033评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,321评论 1 293
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,128评论 3 398
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,347评论 2 377

推荐阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,285评论 0 25
  • 目录 0.树0.1 一般树的定义0.2 二叉树的定义 1.查找树ADT 2.查找树的实现2.1 二叉查找树2.2 ...
    王侦阅读 7,296评论 0 3
  • 一. 算法之变,结构为宗 计算机在很多情况下被应用于检索数据,比如航空和铁路运输业的航班信息和列车时刻表的查询,都...
    Leesper阅读 6,976评论 13 42
  • 0.目录 1.算法导论的红黑树本质上是2-3-4树 2.红黑树的结构和性质 3.红黑树的插入 4.红黑树的删除 5...
    王侦阅读 2,512评论 1 2
  • 红黑树为一棵二叉搜索树,它为每个结点增加一个变量存储结点颜色,利用结点颜色对树的形状进行约束,使其近似平衡(并非完...
    LRC_cheng阅读 486评论 0 1