红黑树
来源:互联网 发布:js和flash 编辑:程序博客网 时间:2024/06/05 18:52
- 概述
- 红黑树的插入
- 红黑树的删除
概述
红黑树是AVL树的一个变种.
它具有如下性质:
- 每个节点是红色的或者黑色的
- 根节点是黑色的
- 如果一个节点是红色的,则其子节点必须是黑色的(即不存在父子节点同为红色)
- 从任一节点到其各个叶子节点的所有路径都包含相同数目的黑色节点
- 每个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)的兄弟节点是红色.
祖父节点(xpp)作为插入节点(x)的递归向上节点.如果祖父节点(xpp)是根节点,则直接变为黑色节点.
II.父节点(xp)的兄弟节点是黑色(没有用兄弟节点时,按性质5,将空节点视为黑色节点).
父节点(xp)与祖父节点(xpp)颜色交换,然后右旋
如果插入节点(x)是父节点(xp)的左子节点,需在插入节点(x)和其父节点(xp)之间做一次左旋.
红黑树的删除
- 删除情况分为:
- 1.删除节点有双子树
- 将其与其右子树的最小节点进行位置和颜色交换. 删除则变为了2或3
- 2.删除节点有单子树
- 由性质3,4可知,删除节点是黑色,其子节点是红色.直接由其子节点替换它,并将子节点设为黑色.
- 3.删除节点没有子树
- 如果删除节点是红色,直接删除,不违反任何规则
- 如果删除节点(d)是黑色(由性质4,此节点必有兄弟节点(b)):
I.兄弟节点(b)为黑色,且b的右子节点(br)为红色
兄弟节点(b)与父节点(p)交换颜色,然后左旋,并将兄弟节点(b)的右子节点(br)设为黑色
II.兄弟节点(b)为黑色,且b的右子节点为黑色,左子节点为红色
B和Bl交换颜色,并以B做右旋,此时变为了I所述
III.兄弟节点(b)为黑色,且b的右子节点为黑色,左子节点也为黑色a.删除节点(d)的父节点(p)为红色
父节点(p)与兄弟节点(b)交换颜色
b.删除节点(d)的父节点(p)为黑色
父节点(p)左右子树都减少一,p做为D的递归向上传导节点.如果p为根节点,则整棵树所有路径上黑节点数减一
IV.兄弟节点(b)为红色
兄弟节点(b)与父节点(p)交换颜色,然后左旋.问题变换为:删除节点(d)的兄弟节点(b)为黑色,且父节点(p)为红色的问题,见前面I,II,III
0 0
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- 红黑树
- java学习日志(九)-- 工具类、静态代码块、单例设计模式
- 条件编译 #ifndef _HEAD_H...中下划线的理解!
- SQL函数
- C语言中的运算符易混淆概念总结
- Linux下最完整的Samba服务器配置攻略
- 红黑树
- OpenCV学习笔记六:直方图(2)
- dijkstra模板
- 嵌入式Linux应用程序开发详解教程含源代码例子
- 《30天编写操作系统》 如何让虚拟机vmware 从img文件启动(其实就是配置软盘启动)
- Create tabel 建表实例
- Window10 + tensorflow 安装(解决Error importing tensorflow, unless you are using bazel...)
- 网易2017实习生招聘笔试题 C++开发工程师
- 剑指Offer 24 二叉搜索树的后序遍历序列