红黑树

来源:互联网 发布:js和flash 编辑:程序博客网 时间:2024/06/05 18:52

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

概述

红黑树是AVL树的一个变种.

它具有如下性质:

  1. 每个节点是红色的或者黑色的
  2. 根节点是黑色的
  3. 如果一个节点是红色的,则其子节点必须是黑色的(即不存在父子节点同为红色)
  4. 从任一节点到其各个叶子节点的所有路径都包含相同数目的黑色节点
  5. 每个NIL节点(或称为空节点)可当作黑色的
    (性质5,一些书籍没将其作为性质,其存在主要是方便分析插入和删除操作)

通过性质1,3,4可以得知:
1.任意节点最大子树高度(或树深)和最小子树高度(或树深)之比在1到2之间.
2.红黑树的高度最多是2log(N+1)

因此,在红黑树中查找,其查找算法的时间复杂度为O(logN).

红黑树相比于AVL树的优点是,由于其对树高度要求的放宽,使其更容易的插入和删除,从而提高插入和删除的性能.

根据性质,有如下推论:
推论1: 红色节点必有父节点
推论2: 如果一个节点有黑色子节点,则必为双子树节点

红黑树的插入

默认插入节点的颜色是红色
1.空树插入.
插入节点由红色改为黑色,此节点即为根节点,满足性质2:
2.插入节点的父节点颜色是黑色.
直接插入节点,不会违反任何性质.
3.插入节点(x)的父节点(xp)颜色是红色.
由性质2,3可知,父节点(xp)一定还有父节点(xpp), 即插入节点(x)有祖父节点(xpp),且祖父节点(xpp)是黑色
I.父节点(xp)的兄弟节点是红色.
 xp的兄弟节点xppr是红色
 转换后
 祖父节点(xpp)作为插入节点(x)的递归向上节点.如果祖父节点(xpp)是根节点,则直接变为黑色节点.
 
II.父节点(xp)的兄弟节点是黑色(没有用兄弟节点时,按性质5,将空节点视为黑色节点).
 xp的兄弟节点xppr是黑色
 右旋
 父节点(xp)与祖父节点(xpp)颜色交换,然后右旋
 如果插入节点(x)是父节点(xp)的左子节点,需在插入节点(x)和其父节点(xp)之间做一次左旋.

红黑树的删除

删除情况分为:
1.删除节点有双子树
将其与其右子树的最小节点进行位置和颜色交换. 删除则变为了2或3
2.删除节点有单子树
由性质3,4可知,删除节点是黑色,其子节点是红色.直接由其子节点替换它,并将子节点设为黑色.
3.删除节点没有子树
如果删除节点是红色,直接删除,不违反任何规则
如果删除节点(d)是黑色(由性质4,此节点必有兄弟节点(b)):
I.兄弟节点(b)为黑色,且b的右子节点(br)为红色
 b的右子节点为红色
 新平衡
兄弟节点(b)与父节点(p)交换颜色,然后左旋,并将兄弟节点(b)的右子节点(br)设为黑色
II.兄弟节点(b)为黑色,且b的右子节点为黑色,左子节点为红色
 b的右子节点为黑色,左子节点为红色
 转换后
 B和Bl交换颜色,并以B做右旋,此时变为了I所述
 
III.兄弟节点(b)为黑色,且b的右子节点为黑色,左子节点也为黑色
a.删除节点(d)的父节点(p)为红色
 父节点(p)为红色
 新平衡
 父节点(p)与兄弟节点(b)交换颜色
b.删除节点(d)的父节点(p)为黑色
 父节点(p)为黑色
 父节点(p)左右子树都减少一
 父节点(p)左右子树都减少一,p做为D的递归向上传导节点.如果p为根节点,则整棵树所有路径上黑节点数减一
IV.兄弟节点(b)为红色
兄弟节点(b)为红色
转换后
兄弟节点(b)与父节点(p)交换颜色,然后左旋.问题变换为:删除节点(d)的兄弟节点(b)为黑色,且父节点(p)为红色的问题,见前面I,II,III
0 0