STL学习笔记(四)---树与关联式容器

关联式容器,观念上类似关联式数据库(实际上则简单许多) :每笔数据(每个元素)都有一个键值(key) 和一个实值(value) 。当元索被插入到关联式容器中时,容器内部结构(可能是RB-tree,也可能是hash-table)便依照其键值大小,以某种特定规则将这个元素放置于适当位置。关联式容器没有所谓头尾(只有最大元素和最小元素),所以不会有所谓push_back(). push_front().pop_back(). pop_front(). begin().end() 这样的操作。一般而言,关联式容器的内部结构是个balanced binary tree(平衡二叉树),以便获得良好的搜寻效率。balanced binary tree有许多种类型,包括AVL-tree,RB-tree, AA-tree,其中最被广泛运用于STL的是RB-tree (红黑树)。
STL学习笔记(四)---树与关联式容器_第1张图片

一、二叉搜索树

二叉搜案树(binary search tree),可提供对数时间(logarithmic time) 的元素插入和访问。二叉搜索树的节点放置规则是:任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。因此,从根节点一直往左走,直至无左路可走,即得最小元素;从根节点一直往右走,直至无右路可走,即得最大元素,图5-4所示的就是一棵二叉搜索树。
 STL学习笔记(四)---树与关联式容器_第2张图片

有数种特殊结构如AVL-tree,RB-tree,AA-tree,均可实现出平衡二叉搜索树,普通的二叉树在插入元素是正序或者逆序的时候,左右子树的高度会变得极其不平衡,导致丧失了查找复杂度O(logN)的优势,复杂度会增长到O(N),所以就引入了AVL树和红黑树。能够在元素插入删除时候自动按照给定的规则调整元素间的顺序关系从而保持平衡。它们比一般的(无法绝对维持平衡的)二叉搜索树复杂,因此插入节点和删除节点的平均时间也比较长,但是它们可以避免极难应付的最坏(高度不平衡)情况,而且由于总是保持某种程度的平衡,所以元素的访问查找时间平均也比较少。

1、AVL tree ( Adelson-Velskii-Landis tree ) 

AVLtree是一个“加上了额外平衡条件” 的二叉搜索树。其平衡条件的建立是为了确保整棵树的深度为OlogN)。 AVLtree要求任何节点的左右子树高度相差最多1。

2、 RB-tree (红黑树)

AVL-tree之外,另一个被广泛运用的平衡二叉搜索树是RB-tree(红黑树) 。RB-tree不仅是一个二叉搜索树,而且必须满足以下规则:

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

你可能感兴趣的:(链表,c++,数据结构,指针,后端)