源码剖析:STL中树的导览

本文介绍了STL中关联式容器的底层实现基础。首先区分了序列式和关联式容器的概念,重点讲解二叉搜索树的结构特性及其插入、删除操作。针对二叉搜索树可能出现的不平衡问题,文章进一步阐述了平衡二叉搜索树的概念,详细说明了通过单旋转和双旋转操作来维持树的平衡状态的方法。这些内容为后续讲解红黑树这一关联式容器的核心数据结构奠定了基础,并暗示将单独深入探讨红黑树的具体实现。全文由浅入深地构建了理解STL关联式容器的知识框架。

作者
WildPointer
发布
2024.08.01
专栏
源码剖析
阅读
约 2 分钟 / 622 次原文浏览
源码剖析:STL中树的导览

前言

在阅读了STL源码刨析系列的前几章,我们可以知道容器分为序列式容器和关联式容器。在前几个小节中,我们对序列式容器中的vector和list容器进行了讲解,并比较了vector和list的区别。本章将对红黑树进行讲解记录,并以此引出set和map容器。


关联式容器

        所谓关联式容器即是存储的数据都存在一个键值(Key)和一个实值(Value),当元素被插入到关联式容器中时,容器内部的结构便会依照键值的大小,以某种特定规则将这个元素放置于适当的位置


二叉搜索树

二叉树,想必大家在学习过数据结构后都有所耳闻。其二叉树即是任意一个节点最多只允许存在两个子节点。而二叉搜索树便是在二叉树的基础上,新增了一条规则:任意节点的键值一定大于左子树中的每一个节点的键值,并小于右子树中每一个节点的键值。

图1.二叉搜索树示例

在简单了解二叉搜索树后,我们还需要对二叉搜索树的节点插入操作和删除操作进行简单的演示

图2.二叉搜索树节点插入操作

图3.二叉搜索树节点删除操作1

图4.二叉搜索树节点删除操作3


平衡二叉搜索树

        平衡二叉搜索树是由于二叉搜索树在进行插入或删除操作的时候,导致二叉搜索树的左子树和右子树的层数相差大于1。而所谓的“平衡”即是树中的左子树和右子树相差的层数小于大于1,即为平衡,可参考下图:

图5.平衡二叉搜索树示例

在了解了什么是平衡二叉搜索树之后,我们将需要认识到在对于一个不平衡的二叉搜索树时,我们需要如何操作使其平衡?此时我们便需要引入一个名词——“旋转”。而旋转的方式分为两种,一种是单旋转,另一种是双旋转。单旋转应对的是外侧插入节点,双旋转应对的是内侧插入节点,具体如下:

图6.四种“平衡破坏”情况

在了解了四种平衡被破坏的情况后,我们需要了解单旋转和双旋转是如何对这四种平衡被破坏的情况进行转换,将不平衡状态转为平衡状态:

1.单旋转 

图7.单旋转

2.双旋转

图8.双旋转


本章节只是简单的回顾了一下二叉搜索树和平衡二叉搜索树的内容,具体关于关联式容器中的红黑树将单独作为一个小节进行讲解

4次原文点赞;这里的喜欢仅保存在本机
WildPointer

专注系统编程、工程实践与底层技术,记录 C++、Qt、OpenCV 与 VTK 的学习和实践。