STL源码剖析之红黑树【2013.12.05】

原创 2013年12月05日 10:30:25

STL源码剖析之红黑树【2013.12.05】

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 

【红黑树】

红黑树是一种受限制的搜索树,其限制如下:


.


【红黑树的节点插入】

为了方便解说,闲定义几个数值:

【X】插入节点,插入点必为红色,保持约束4

【P】X的父节点

【G】P的父节点

【GG】G的父节点

【S】P的兄弟节点

根据红黑树节点的插入,可以分为几种情况:

【一】


此情况:

只需要进行一次旋转就可以保持红黑树特性;

【二】


此情况,需要两次旋转才能保持红黑树的特性

【三】


此情况,也只需要一次旋转就可以完成

【四】


此情况也只需要一次旋转就能完成。

这种情况,需要向上递归寻找父节点,判断父节点的红黑情况,在树比较小的时候虽然可以接受,但是当树比较大的时候就是一种比较大的效率开销了。

怎么办呢?

办法当然被牛人们想到啦,对红黑树做一个自顶向下的遍历。当然是沿着插入点路径了。

当遇到路径上某个节点【M】的两个子节点都为红色的时候:将【M】点变成红色,两个子节点变成黑色。(参考约束4),如图所示:


另外要注意的一点,虽然红黑树是一种搜索树,是平衡二叉树

但是其实红黑树对平衡的要求不是那么严谨的,有时候可能不会做到平衡,但是仍保持搜索树的其他特性。


STL中,红黑树的节点代码设计比较特别的一点是:

ROOT根节点之上 还有个 Header节点。

他们不但互相为父子节点,而且Header节点的Left指向红黑树中最小节点,Right指向最大节点。


当然初始状态的时候,只有Header点,这时候,left和right都是指向自己,parent则是指向0(NULL)

当插入第一个节点的时候,即为根节点的时候,就看作最大最小值都是ROOT节点,Header和ROOT的关系就不但互相指向父子节点,而且left和right都指向Root。如图所示:


为什么这样做呢?

【原因1】:这样可以快速找到红黑树的最小最大值。

【原因2】:STL中红黑树是有++ 和 -- 两种操作符的,说明红黑树是可以递增递减遍历的,这样的设计就可以让迭代器快速找到begin和end啦。对效率来说是一种很巧妙的设计!


【注意】

红黑树的构造,主要功效就是做搜索,这也是红黑树的最大生命意义了,呵呵!

至于STL中红黑树的搜索,就不多说了。

比较节点,节点值比搜索值大的往左走,小的往右走。




欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 

相关文章推荐

STL源码剖析_读书笔记:第五章 关联式容器 红黑树篇

关联式容器 实现:红黑树,按照键值大小将元素放于适当位置 内部结构:平衡二叉树 含义:每个元素都有键值与实值 二叉搜索树:对数时间的元素插入和访问,节点键值大于左子树中每个节点键值,小于右子树...

STL源码剖析-----红黑树原理

一、红黑树概述      红黑树和我们以前学过的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。不过自从红黑树出来后,AVL树就被放到了博物馆里,据...

STL源码剖析---红黑树原理详解下

算法导论书上给出的红黑树的性质如下,跟STL源码剖析书上面的4条性质大同小异。       1、每个结点或是红色的,或是黑色的       2、根节点是黑色的       3、每个叶结点(NIL)是黑...

STL源码剖析---红黑树原理

一、红黑树概述      红黑树和我们以前学过的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。不过自从红黑树出来后,AVL树就被放到了博物馆里,据...
  • zqt520
  • zqt520
  • 2012年07月28日 14:14
  • 6083

STL源码剖析——RB-Tree(红黑树)

前言 有关红黑树的zh

STL源码剖析---红黑树原理详解

一、红黑树概述      红黑树和我们以前学过的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。不过自从红黑树出来后,AVL树就被放到了博物馆里,据...

STL源码剖析之树 tree 二叉搜索树 红黑树【2013.12.04】

STL源码剖析之树 tree 二叉搜索树 红黑树【2013.12.04】 欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611  树 ...
  • xinmuba
  • xinmuba
  • 2013年12月04日 10:33
  • 812

STL源码之红黑树

1. 基本概念       红黑树是平衡二叉搜索树的一种,其通过特定的操作来保持二叉查找树的平衡。首先,我们来复习一下二叉查找树的知识,建议如果对二叉查找树不理解的先去搜一下相关博客来了解一下。二叉搜...

红黑树实现源码

  • 2017年07月22日 22:21
  • 1KB
  • 下载

菜鸟nginx源码剖析数据结构篇(四)红黑树ngx_rbtree_t

ngx_rbtree是一种使用红黑树实现的关联容器,关于红黑树的特性,在《手把手实现红黑树》已经详细介绍,这里就只探讨ngx_rbtree与众不同的地方;ngx_rbtree红黑树容器中的元素都是有序...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL源码剖析之红黑树【2013.12.05】
举报原因:
原因补充:

(最多只允许输入30个字)