红黑树(第一篇)

守給你的承諾、 提交于 2020-12-28 01:14:50

介绍

  • R-B Tree全称Red-Black Tree,又名红黑树
  • 1972年由鲁道夫.贝尔发明
  • 一种自平衡二叉查找树
  • 二叉查找树每个节点增加一个存储位表示节点的颜色,非黑即红
  • 时间复杂度O(log n)
  • 二叉查找树?
  • 平衡二叉查找树?

二叉查找树

  • Binary Search Tree
  • 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值
  • 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值
  • 任意节点的左、右子树也分别为二叉查找树
  • 没有键值相等的节点
  • 时间复杂度O(log n)(最好的情况下)
  • 例子
    • 二叉查找树
    • 退化成线性的二叉查找树,时间复杂度O(n)

平衡二叉查找树

  • AVL
  • 任何一个节点的左子树与右子树都是平衡二叉查找树,且高度之差的绝对值不超过1(即平衡因子:左子树高度-右子树高度,1 or 0 or -1)
  • 严格的平衡二叉查找树
  • 对于查找友好,对于插入、删除不够友好,频繁破坏规则,频繁旋转以适应规则
  • 例子

RB特性

  • 每个节点或者黑色,或者红色
  • 根节点是黑色
  • 每个叶子节点(NIL)是黑色(注:此处叶子节点,指为空(NIL或NULL)的叶子节点)
  • 如果一个节点是红色的,则它的子节点必需是黑色的
  • 对任意节点,其到叶子节点(NIL)的每条路径都包含相同数目的黑色节点
  • 例子

时间复杂度

  • 定理:一棵含有n个节点的红黑树的高度至多为2log(n+1)
  • 逆否命题:高度为h的红黑树,包含的内节点个数至少为 $2^{h/2}-1$ 个
  • 黑高:从某个节点X(不包含该节点)触发,到达一个叶子节点的任意一条路径上,黑色节点的个数称为该节点的黑高度,记为bh(x)
  • 根据特性5,从节点X到达所有叶子节点具有相同数目的黑节点,即bh(x)的值是唯一的!
  • 根据特性4,从节点X到达所有叶子节点所经历的黑节点数目>=所经历的红节点的数目。假设X为根节点,则hb(x)>=h/2,代入上面的逆否命题公式。则逆否命题公式变为: 高度为h的红黑树,包含的黑节点个数至少为$2^{bh(x)}-1$个
  • 数学归纳法
    • 当h=0时,则黑高bh(x)=0,$2^{bh(x)}-1=0$。原命题成立
    • 当h>0时,设树高度为h,对于节点X(X为根节点),其黑高度为bh(x)。对于节点X的左右子树,黑高度为bh(x)或者bh(x)-1
    • 归纳假设,左、右子树至少包含$2^{bh(x)-1}-1$个内部节点
    • 所以,节点X所包含的节点树至少为 $$(2^{bh(x)-1}-1)+(2^{bh(x)-1}-1)+1=2^{bh(x)}-1$$ 即节点X所包含的节点至少为$2^{bh(x)}-1$,原命题成立
    • 综上,高度为h的红黑树,包含的黑节点个数至少为$2^{bh(x)}-1$个,因此,一棵含有n个节点的红黑树的高度至多为2log(n+1)

应用

  • JDK 1.8 HashMap
  • Linux普通进程调度,用红黑树管理进程控制块
  • Nginx中用红黑树管理定时器
  • IO多路复用epoll实现采用红黑树管理sockfd
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!