AVL-tree、RB-tree、AA-tree均可以实现平衡的二叉查找树,虽然相对于一般的二叉搜索树其插入、删除节点的平均时间会比较长,但它们可以避免极验证应付的最坏的情况--树高度不平衡。

平衡二叉查找树所谓的平衡并不是绝对的平衡,而是要求任何一个节点的左右子树高度相差不会超过1,此时仍能够保证树的“对数深度”。

如上图所示,X节点本来是平衡的,插入一个新节点后“平衡被破坏”了,这可以分为4种情况:

1.插入节点位于X的左子节点的左子树--左左;
2.插入节点位于X的左子节点的右子树--左右;
3.插入节点位于X的右子节点的左子树--右左;
4.插入节点位于X的右子节点的右子树--右右。
情况1、4彼此对称,称为外侧插入,可以采用单旋操作调整解决;情况2、3彼此对称,称为内侧插入,可以采用双旋转操作调整解决。


单反转


插入新节点11出现情况1的调整策略:把中k1作为其左子孩子k2的右孩子,而k2原先的右孩子作为现在k1的左孩子。
出现情况4的调整策略类同。


双反转


插入新节点15出现情况2的调整策略:先让k2和k1做一次单旋转,再让k2和k3做一次单旋转。
出现情况3的调整策略类同。


红黑树RB-tree

C++中的set和map底层用的就是红黑树。
RB-tree是满足以下4个条件的二叉查找树:

1.每个节点不是红色就是黑色
2.根节点为黑色
3.红节点的子节点必须是黑色
4.任一节点至NULL(树尾端)的每一条路径上,所含黑节点的数目必须相同
红黑树并不要求左右子树高度差控制在1以内,它的平衡条件比AVL树弱,它只能保证任何一个节点的左右子树的高度差不会超过较矮的那棵的一倍。然而红黑树通常能够导致良好的平衡状态,经验告诉我们,红黑树的平均搜索效率和AV-tree几乎相等,但是其插入节点的开销相对较低,实践中发生旋转的次数相对较少。
以下所有操作,在新插入节点后,首先将新节点设为红色。
按照二叉查找树的规则插入新节点后,如果新增节点的父节点为黑,则直接插入。否则分为4种情况(在此作一些符号约定,新增节点为X,其父节点为P,祖父节点为G,伯父节点为S,曾祖父节点为GG):

1.S为黑,且X为外侧插入。P,G做一次单旋转,并更改P,G的颜色。
2.S为黑,且X为内侧插入。 X,P做一次单旋转,并更改X和P的颜色。再对X,G做一次单旋转。
3.S为红,且X为外侧插入。 P,G做一次单旋转,并更改X的颜色。此时如果GG为黑,一切搞定;
否则,还得继续往上做,直到不再有父子节点连续为红的情况。
4.S为红,且X为内侧插入。直接更改P,S,G的颜色。此时如果GG为黑,一切搞定;否则,还得继续往上做,直到不再有父子节点连续为红的情况。

为了避免上述情况3、4中GG也为红的情况发生,我们设计一个“自顶向下”的红黑树。假设新增节点为A,那么就延着从根节点到A的路径,只要看到某个节点X的两个子节点皆为红色,就把这两个子节点改为黑色,同时把X改为红色。但是如果此时X的父节点也是红色(注意此时X的伯父节点已经不可能是红色),就像上述情况1那样作一次单旋转改变颜色,或像情况2那样做一些双旋转再改变颜色。

机器喵之红黑树(三)相关推荐

  1. 红黑树(三)之 C++的实现

    概要 前面分别介绍红黑树的理论知识和红黑树的C语言实现.本章是红黑树的C++实现,若读者对红黑树的理论知识不熟悉,建立先学习红黑树的理论知识,再来学习本章. 目录 1. 红黑树的介绍 2. 红黑树的C ...

  2. 红黑树(一)之 原理和算法详细介绍---转帖

    目录 1 红黑树的介绍 2 红黑树的应用 3 红黑树的时间复杂度和相关证明 4 红黑树的基本操作(一) 左旋和右旋 5 红黑树的基本操作(二) 添加 6 红黑树的基本操作(三) 删除 作者:Sky W ...

  3. 红黑树(二)之 C语言的实现

    红黑树(二)之 C语言的实现 概要 红黑树在日常的使用中比较常用,例如Java的TreeMap和TreeSet,C++的STL,以及Linux内核中都有用到.之前写过一篇文章专门介绍红黑树的理论知识, ...

  4. 红黑树(一)之 原理和算法详细介绍

    出处:http://www.cnblogs.com/skywang12345/p/3245399.html 概要 目录 1 红黑树的介绍 2 红黑树的应用 3 红黑树的时间复杂度和相关证明 4 红黑树 ...

  5. 红黑树解决了什么问题

    /*** 平衡二叉树:就是为了防止二叉搜索树变为线性数据结构,而出现的数据结构* 而AVL树-绝对平衡树.左右子树的高度差不能超过1* 红黑树:特性:* 1.每个结点不是红色就是黑色* 2.根节点:一 ...

  6. 红黑树 之 原理和算法详细介绍

    概要 目录 1 红黑树的介绍 2 红黑树的应用 3 红黑树的时间复杂度和相关证明 4 红黑树的基本操作(一) 左旋和右旋 5 红黑树的基本操作(二) 添加 6 红黑树的基本操作(三) 删除 作者:Sk ...

  7. 红黑树 原理和算法详细介绍(Java)

    R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为"红黑树",它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red) ...

  8. 哈希表、红黑树、B树、B+树基础

    一.哈希表 也叫散列表,是根据关键码值而直接进行数据访问的数据结构.(把关键码值映射到表中一个位置来访问记录)映射函数叫做散列函数,存放记录的数组叫做散列表. 散列查找过程分为两步: (1)在存储时通 ...

  9. 真c++ 从二叉树到红黑树(6)之红黑树RedBlack

      此文章为从二叉树到红黑树系列文章的第六节,主要介绍介绍红黑树,相信,有了之前BST,AVL和B树的铺垫,你会很快地理解红黑树.但红黑树的情况也十分复杂,因此,推荐分两天来看红黑树.一天看插入,一天 ...

  10. 在面试官面前优雅地种下红黑树

    前言 希望面对面试官的各种红黑树的灵魂拷问时,也能像标题一般,优雅地娓娓道来. 目录 一.红黑树的基本性质 二.为什么要用红黑二叉树 1. 二叉搜索树(Binary Search Trees) 2.二 ...

最新文章

  1. mysql root的密码忘了?linux下重置mysql的root用户密码。
  2. 解题报告(八) prufer 序列与 Cayley 公式(ACM / OI)超高质量题解
  3. 大哥你怕是没听过:头上没毛,代码不牢!
  4. python读书笔记二、文件基本操作
  5. C语言Socket动态ajax网页,简单的ajax聊天网页 socket
  6. 变频电源要怎么测定额定容量
  7. Codeforces Round #377 (Div. 2) 732A B C D E F
  8. 这是一份编程宝典,请查收!
  9. HTML5:表单提交
  10. 如何用 RFM 模型扒出 B 站优质 UP 主?| 附实战代码
  11. websocket 如何知道对方断开_在爱情里你知道该如何和对方相处吗?
  12. 构建会员运营管理系统 帮助零售企业数字化转型
  13. 微信账号注销了能恢复吗
  14. pyqt5标签中的字设置不同字体_PyQt5 控件字体样式等设置的实现
  15. 移动网维嘉忆网络基础设施介绍手稿笔记
  16. 如何设置无线路由器,实现WIFI上网?
  17. linux中错误编号对应意思
  18. JavaScript最全面试题
  19. 行业分析-功能性软饮市场现状及未来发展趋势
  20. 看透HiPiHi,不再是游戏

热门文章

  1. eclipse 中使用字符流复制文件乱码解决
  2. 百度地图java批量获得经纬度_批量调用百度地图API获取地址经纬度坐标
  3. 软件生命周期是指什么?
  4. 常见反爬虫方法及其应对策略
  5. WIN10专业版如何调整系统字体大小
  6. html中字体都可以设置哪些,html中设置字体的属性有哪些
  7. Qt使用libmodbus
  8. Java 解压 gzip 和 tar.gz 文件
  9. linux 海思hi3798m_海思Hi3798模块芯片,Hi3798处理器参数介绍
  10. 批量打印Word文档并记录(一)