在我看来,看源码是一件既痛苦又兴奋的事。当我们在推敲其中的难点时,是及其痛苦的,但当发现实现代码是那么丝滑简洁时,“wc, nb!”。


1. 导语

如果我们去看关联式容器map、set、multimap、multiset源代码,我们发现绝大部分操作如插入、修改、删除、搜索,均是由其内含的红黑树来完成的,我们有必要去揭开她的神秘面纱,一览她的绝世风姿。

(如果你手头还没有《STL源码剖析》时,强烈建议你现在就去买一本or文末的百度云链接or网路上的其他资源)

关键词:RB-tree、BST、AVL tree 、STL Sources


 从哪里讲起呢?

二叉搜索树,每个节点最多有两个子节点,而每个节点键值一定大于左子树键值节点键值,而小于右子树节点键值。这样一来,就可以提供对数时间的插入和搜索。

当然,较为复杂的是它的删除操作。

1.如果删除的是叶子,那么直接删除delete该指针即可;

2. 如果删除的不是叶子,而他只有一个节点,那么就将其子节点连至它的父节点;

3. 如果删除的不是叶子,而他有两个节点,那么就用它的右子树的最小节点代替他(值赋给它),删除该右子树最小节点。

(这是为什么?因为删除之后还要保证二叉树的搜索,所以替代他的元素就需要是比他大的下一个元素,而比他大的元素都在右子树,且最小的哪一个就是最左边的那一个。其实在二叉搜索树中,要找最大就一直向右子树找,要找最小就一直往左子树找)

  上述例子是在二叉树平衡的情况下进行的。平衡即左右子树高度相近,完全平衡则要求左右子树高度(深度/层数)完全相等。要是完全平衡的条件下,我们的搜索和插入操作就会是对数时间,这无疑是相当快的(当然比起Hashtable的大致O(1)来说是较慢的),这在关联式容器中是我们所追求的。因为它们的底层均不是线性结构,能达到常数时间的查找/搜索。

  但是要知道,维护一个二叉树的完全平衡是非常耗时的,比如我插入之后,很大概率就会使得二叉树不完全平衡,就需要复杂度旋转移位操作,这对于插入来说非常不划算,也就是说,我们没必要为了平衡而平衡,只要达到大致平衡,就可以得到统计上的对数查找插入时间。

那么进入我们的正题,平衡二叉搜索树。


2. 平衡二叉搜索树

这里的平衡,是指没有任何节点的深度过大,而非绝对的平衡。

代表结构:RB-tree、AVL-tree、AA-tree

本片主要介绍红黑树,AVL-tree将在其他篇章中讲解。


3. RB-tree

红黑树,一种自平衡的二叉查找树。它的最坏情况运行时间也是良好的,并且在实践中是高效的,它可以在O(log n)时间内做查找,插入和删除。(来自百度百科)

无疑,它的实现是非常复杂的,搜索几乎是是它最为简单的操作,复杂度O(log n),最坏也是如此。而插入和删除就比较困难了,查找到插入节点/删除节点复杂度O(log n),在插入时、插入后、删除后都需要满足它的红黑规则限定

STL源码剖析 - RB-tree的更多相关文章

  1. STL"源码"剖析-重点知识总结

    STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...

  2. 【转载】STL"源码"剖析-重点知识总结

    原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...

  3. STL"源码"剖析

    STL"源码"剖析-重点知识总结   STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略 ...

  4. (原创滴~)STL源码剖析读书总结1——GP和内存管理

    读完侯捷先生的<STL源码剖析>,感觉真如他本人所说的"庖丁解牛,恢恢乎游刃有余",STL底层的实现一览无余,给人一种自己的C++水平又提升了一个level的幻觉,呵呵 ...

  5. 《STL源码剖析》环境配置

    首先,去侯捷网站下载相关文档:http://jjhou.boolan.com/jjwbooks-tass.htm. 这本书采用的是Cygnus C++ 2.91 for windows.下载地址:ht ...

  6. STL源码剖析读书笔记之vector

    STL源码剖析读书笔记之vector 1.vector概述 vector是一种序列式容器,我的理解是vector就像数组.但是数组有一个很大的问题就是当我们分配 一个一定大小的数组的时候,起初也许我们 ...

  7. STL源码剖析 迭代器(iterator)概念与编程技法(三)

    1 STL迭代器原理 1.1  迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,而迭代器(i ...

  8. 《STL源码剖析》相关面试题总结

    原文链接:http://www.cnblogs.com/raichen/p/5817158.html 一.STL简介 STL提供六大组件,彼此可以组合套用: 容器容器就是各种数据结构,我就不多说,看看 ...

  9. STL源码剖析之序列式容器

    最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...

随机推荐

  1. 【转】Selenium-xpath详解

    1.XPATH是什么 XPATH是一门在XML文档中查找信息的语言,XPATH可用来在XML文档中对元素和属性进行遍历,主流的浏览器都支持XPATH,因为HTML页面在DOM中表示为XHTML文档.X ...

  2. [Feature] Feature selection

    Ref: 1.13. Feature selection Ref: 1.13. 特征选择(Feature selection) 大纲列表 3.1 Filter 3.1.1 方差选择法 3.1.2 相关 ...

  3. Web聊天室的实现

    Tornado普通方式实现聊天室 普通的http方式连接的话,基本思路是前端页面通过JS重复连接后端服务器. 核心文件:app.py #!/usr/bin/env python # -*- codin ...

  4. 浏览器最小显示12px字体的解决方法

    今天做打印标签,发现浏览器最小字体限制了12px,标签那么小,12px随便几个字就给占满了: 最后通过  transform:scale(1,0.8) 搞定: 这个属性允许将元素移动.压缩.旋转:这里 ...

  5. migrate设置

    migrate配置 进入项目manage所在的目录中执行如下命令,否则会报错:no such table: django_session 进入cmd 输入盘符比如:E: 切换目录 cd E:\prog ...

  6. linux EXT4格式分区扩容

    1.查看现有的分区大小  2.关机增加磁盘大小为100G  3.查看磁盘扩容后状态 lsblk或dh -TH 4.进行分区扩展磁盘,保留根目录的起止位置.  5.删除根分区,不要保存  6.创建分区, ...

  7. 机器学习笔记——k-近邻算法(一)(摘抄于《机器学习实战》)

    k-近邻算法 k-近邻算法(kNN),它的工作原理是:存在一个样本数 据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 与所属分类的对应关系.输入没有标签的新数据后 ...

  8. Java线程安全队列Queue实现原理

    原文链接:https://www.cnblogs.com/DreamRecorder/p/9223016.html 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.J ...

  9. hadoop WordCount例子详解。

    [学习笔记] 下载hadoop-2.7.4-src.tar.gz,拷贝hadoop-2.7.4-src.tar.gz中hadoop-mapreduce-project\hadoop-mapreduce ...

  10. Visual studio 2010(VS2010) 安装MSDN方法

    首先保证VS2010已经安装完毕 1.解压VS2010的安装文件(ISO),会看到ProductDocumentation文件夹,该文件夹下即为MSDN. 2.启动vs2010,点击"帮助& ...