关联式容器map、set底层红黄黑的理解

首先STL库提供的关联式容器map、set、multiset、multimap底层是用RB-tree实现的,其实它们更像是一种适配器,就像栈和队列是用deque实现一样,这其实是类之间关系(继承、组合、委托)的组合,即是(Has-a)的关系。

红黑树是一种平衡二叉搜索树,先说二叉搜索树,二叉搜索树实际类似于二分法,大于中值往右边搜,小于中值往左边搜索,故二叉搜索树以根节点开始,左子树的全部元素必然<右子树的全部元素,任意一节点的左子树同样小于右子树(这也是RB_tree在插入元素自动排序的基础)。再说平衡,平衡是为了提高搜索效率,不至于在搜索的时候,一直往左跑或一直往右跑,因此诞生了(AVL树、RB_tree树),AVL树的平衡条件即左子树和右子树的高度至多为1,如果插入元素打破平衡就需要进行调整;而RB_tree的平衡条件相较于AVL弱一些。

开始介绍RB_tree:
在这里插入图片描述

成为红黑树的约束条件

(1)颜色:所有节点只有只有红色和黑色(非黑即红)

(2)父节点的子节点不能同时为红色,可以同时为黑

(3)根节点一定是黑色

(4)从树的任意一节点起到叶节点,其路径上的所有黑节点必须相同

一般插入元素可能会打破平衡条件,主要是(2)(4)条件,要么调色,要么调色加旋转(左旋、右旋)

插入元素:该元素必须为红色,因为 是黑色就会违反(4),如果运气好,父节点为黑色,好了,不用调整。运气不好父节点时红色违反(2),那就要调色或者旋转+调色
在这里插入图片描述

一条路径上不能出现相邻的两个红色结点。这时就需要通过一系列操作来使红黑树保持平衡。

为了清楚地表示插入操作以下在结点中使用“新”字表示一个新插入的结点;使用“父”字表示新插入点的父结点;使用“叔”字表示“父”结点的兄弟结点;使用“祖”字表示“父”结点的父结点。插入操作分为以下几种情况:
1、黑父
如下图所示,如果新节点的父结点为黑色结点,那么插入一个红点将不会影响红黑树的平衡,此时插入操作完成。红黑树比AVL树优秀的地方之一在于黑父的情况比较常见,从而使红黑树需要旋转的几率相对AVL树来说会少一些。
在这里插入图片描述
2、红父
如果新节点的父结点为红色,这时就需要进行一系列操作以保证整棵树红黑性质。如下图所示,由于父结点为红色,此时可以判定,祖父结点必定为黑色。这时需要根据叔父结点的颜色来决定做什么样的操作。青色结点表示颜色未知。由于有可能需要根结点到新点的路径上进行多次旋转操作,而每次进行不平衡判断的起始点(我们可将其视为新点)都不一样。所以我们在此使用一个蓝色箭头指向这个起始点,并称之为判定点。
在这里插入图片描述
2.1 红叔
当叔父结点为红色时,如下图所示,无需进行旋转操作,只要将父和叔结点变为黑色,将祖父结点变为红色即可。但由于祖父结点的父结点有可能为红色,从而违反红黑树性质。此时必须将祖父结点作为新的判定点继续向上(迭代)进行平衡操作。
在这里插入图片描述
需要注意的是,无论“父节点”在“叔节点”的左边还是右边,无论“新节点”是“父节点”的左孩子还是右孩子,它们的操作都是完全一样的(其实这种**情况包括4种,只需调整颜色,不需要旋转树形)。
2.2 黑叔
当叔父结点为黑色时,需要进行旋转,以下图示了所有的旋转可能:
Case 1:
在这里插入图片描述

Case 2:
在这里插入图片描述

Case 3:
在这里插入图片描述

Case 4:
在这里插入图片描述

可以观察到,当旋转完成后,新的旋转根全部为黑色,此时不需要再向上回溯进行平衡操作,插入操作完成。需要注意,上面四张图的“叔”、“1”、“2”、“3”结点有可能为黑哨兵结点。


自己理解:
1、记忆左旋和右旋:当上面四种情况,你可以画条线,平缓的就是转一次,不平缓就是转2次。
在这里插入图片描述

2、 如何旋转如何变色问题
在这里插入图片描述
参考原文:https://blog.csdn.net/hackbuteer1/article/details/7740956

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值