在我看来,看源码是一件既痛苦又兴奋的事。当我们在推敲其中的难点时,是及其痛苦的,但当发现实现代码是那么丝滑简洁时,“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. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_07-Feign远程调用-Feign测试

    2.2.1 Feign介绍 Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端.Spring Cloud引入 Feign并且集成了Ribbon实 ...

  2. 阶段5 3.微服务项目【学成在线】_day07 课程管理实战_06-课程营销实战分析

    课程营销信息包括课程价格.课程有效期等信息. 课程营销信息使用course_market表存储. 接口我们要提供两个. 接口1先查询课程营销的信息,在页面展示. 接口2:叫做更新,如果发现数据不存在就 ...

  3. 一个link加载多个css文件

    细看正则时匹配慕课网链接时发现的,一个link加载多个css文件 http://static.mukewang.com/static/css/??base.css,common/common-less ...

  4. python判断命令执行成功

    if os.system('lss') !=0: print 'Without the command'

  5. django模板--条件控制标签

    条件控制标签 在django模板中可以通过条件控制标签进行逻辑控制,条件控制标签的语法如下: {% if condition1 %} ... {% elif condition2 %} ... {% ...

  6. linux计划任务以某个用户身份执行

    # Example of job definition: # .---------------- minute (0 - 59) # |  .------------- hour (0 - 23) # ...

  7. IDA7.2破解版本

    更新说明 https://www.hex-rays.com/products/ida/7.2/index.shtml 破解文章 作者阐述了一下对IDA安装密码的攻击方法,通过枚举多种语言默认的随机数发 ...

  8. iOS笔试题01

    1. #import 跟#include.@class有什么区别?#import<> 跟 #import”"又什么区别? 1> #import和#include都能完整地包 ...

  9. 【数据库开发】在Windows上和Linux上配置MySQL的过程

    [数据库开发]在Windows上和Linux上配置MySQL的过程 标签(空格分隔): [编程开发] 首先是在Windows上尝试用QT进行MySQL数据库开发,结果总出现driver不能load的错 ...

  10. redis相关操作命令

    一.相关命令列表: 命令原型 时间复杂度 命令描述 返回值 KEYS pattern O(N) 时间复杂度中的N表示数据库中Key的数量.获取所有匹配pattern参数的Keys.需要说明的是,在我们 ...