STL--关系型容器

1.树的基本概念

1.1二叉搜索树

二叉搜索树:它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

1.2平衡二叉搜索树

平衡二叉搜索树:能够维持根节点的左右子树相对平衡。

例如:AVL-tree、RB-tree、AA-tree。

1.3 AVL tree

AVL tree 是一个加了“额外平衡条件”的二叉搜索树。其平衡条件的建立是为了确保整棵树的深度为O(logN)。直观上的最佳平衡条件是每个节点的左右子树有着相同的高度或者相差1。

1.4 单旋转(single rotation)

插入点位于X的左子树的左节点上—左左,插入点位于X的右子树的右节点上—右右将破坏AVL tree的平衡条件。

可以利用单旋转来恢复二叉树平衡。K2旋转下去成为k1的右子树。16上提。

1.5 双旋转(Double rotation)

插入点位于X的左子树的右节点上—左右,插入点位于X的右子树的左节点上—右左将破坏AVL tree的平衡条件。利用单旋转无法恢复平衡状态。双旋转可由两次单旋转合并而成。s

2. RB-tree

RB-tree 是另外一个颇具历史并被广泛运用的平衡二叉搜索树。而且还满足如下条件:

  1. 每个节点不是红色就是黑色。
  2. 根节点为黑色。
  3. 如果节点为红色,其子节点必须是黑色。
  4. 任一节点至NULL(树尾端)的任何路径所含之黑色节点数必须相同。

根据条件4,新增节点必须为红色,根据条件3,新增节点之父节点必须为红色。当新增节点根据二叉搜索树的规则到达其插入点,却未能符合上述条件时,就必须调整颜色并旋转树形。

2.1 插入节点

RB-tree的构造与内存管理

构造方式有两种:

1、 用现有的RB-tree复制构造一个新的RB-tree,另一种是产生一颗空空如也的树。

rb_tree<int, int, identity<int>, less<int>> itree;

这行程序代码分别指定了节点的键值、实值、大小比较标准…,然后调用RB-tree的default constructor:

rb_tree(const Compare& comp = Compare())

:node_count(0), key_compare(comp){ init(); }

其中的init()是实际技巧上的一个关键点:

private:

void init(){

header = get_node();    //产生一个节点空间,令header指向它

color(header) = _rb_tree_red;             //令header为红色,用来区分header和root(在//iterator.operator++中)

root() = 0;

leftmost() = header;

rightmost() = header;

}

STL--关系型容器的更多相关文章

  1. C++ STL vector容器学习

    STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...

  2. STL List容器

    转载http://www.cnblogs.com/fangyukuan/archive/2010/09/21/1832364.html 各个容器有很多的相似性.先学好一个,其它的就好办了.先从基础开始 ...

  3. STL之容器适配器queue的实现框架

    说明:本文仅供学习交流,转载请标明出处,欢迎转载! 上篇文章STL之容器适配器stack的实现框架已经介绍了STL是怎样借助基础容器实现一种经常使用的数据结构stack (栈),本文介绍下第二种STL ...

  4. STL的容器算法迭代器的设计理念

    1) STL的容器通过类模板技术,实现数据类型和容器模型的分离. 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供了统一性. 3) STL的函数对象实现了自定义数据类型的算法运算 ...

  5. c++复习:STL之容器

    1 STL的string 1 String概念 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的.string与char*都可以用来表示字 ...

  6. stl之容器、迭代器、算法几者之间的关系

    转自:https://blog.csdn.net/bobodem/article/details/49386131 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的优 ...

  7. STL Queue 容器

    STL Queue 容器 Queue简介         queue是队列容器,是一种“先进先出”的容器.         queue是简单地装饰deque容器而成为另外的一种容器.        # ...

  8. STL stack 容器

    STL stack 容器 Stack简介 stack是堆栈容器,是一种“先进后出”的容器.      stack是简单地装饰deque容器而成为另外的一种容器.      #include <s ...

  9. STL Deque 容器

    STL Deque 容器 Deque简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双 端的,而vector是单端的.         ...

  10. 浅谈C++ STL string容器

    浅谈C++ STL string容器 本篇随笔简单讲解一下\(C++STL\)中\(string\)容器的使用方法及技巧. string容器的概念 其实\(string\)并不是\(STL\)的一种容 ...

随机推荐

  1. Taurus.MVC 2.3 开源发布:增强属性Require验证功能,自带WebAPI文档生成功能

    背景: 上周,把 Taurus.MVC 在 Linux (CentOS7) 上部署任务完成后. 也不知怎么的,忽然就想给框架集成一下WebAPI文档功能,所以就动手了. 以为一天能搞完,结果,好几天过 ...

  2. JDK、JRE、JVM三者间的联系与区别

    有Java编程经验的程序员应该都知道:Java程序是运行在JVM(Java虚拟机)上的,在开发程序之前都要配置Java开发环境,其中首先要做的就是JDK的安装和配置,那么JDK.JVM.JRE到底有何 ...

  3. php载入脚本的几种方式对比

    require require_once include include_once 共同点: 都可以在当前 PHP 脚本文件执行时载入另外一个 PHP 脚本文件. require 和 include ...

  4. Adobe系列产品卸载不干净怎么解决

    相信很多朋友都遇到过Adobe系列的产品卸载不干净这种问题,究竟如何来解决这个难题呢? Adobe产品在安装的过程中都会自带卸载程序,因此,小编建议各位不要用其他的卸载清理软件来卸载,这样往往会导致卸 ...

  5. 和逛微博、刷朋友圈一样玩转 GitHub

    自打毕业之后,可以说每天打开 Github 或Email 看有没有 watch 项目的消息或者自己项目的 issue,然后在Explore 看看社区内项目的走势,紧接着开始写代码搬砖的工作,偶尔也会关 ...

  6. SpringBoot整合Swagger2,再也不用维护接口文档了!

    前后端分离后,维护接口文档基本上是必不可少的工作.一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了.当然这是一种非常理想的状态,实际开发中却很 ...

  7. .NET Core 控制台应用程序使用异步(Async)Main方法

    C# 7.1 及以上的版本允许我们使用异步的Main方法. 一.新建一个控制台应用程序 二.异步Main方法 我们直接将Main方法改为如下: static async Task Main(strin ...

  8. Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取

    很多网页的信息都是通过异步加载的,本文就举例讨论下此类网页的抓取. <工作细胞>最近比较火,bilibili 上目前的短评已经有17000多条. 先看分析下页面 右边 li 标签中的就是短 ...

  9. js数组去重排序(封装方法)

    <script type="text/javascript"> // arr代表数组,index代表下标 function lihua(arr, index){ arr ...

  10. vue + element 动态渲染、移除表单并添加验证

    博客地址:https://ainyi.com/66 又接到新需求了吧~~ 背景 在一个大表单里,有可能会出现这种需求,用户可以自己操作动态添加.移除表单,更加个性化的效果. 常见于填写个人信息.附加内 ...