昨晚看到map 和 hash_map 对其中的红黑树概念模糊了。于是晚上翻了下书,以此为记。
1.平衡二叉树: 当且仅当两个子树的高度差不超过1时,这个树是平衡二叉树。(同时是排序二叉树)
平衡二叉树,又称AVL树。它或者是一棵空树,或者是具有下列性质的二叉树:
它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度之差之差的绝对值不超过1.
常用算法有:红黑树、AVL树、Treap等。
平衡二叉树的调整方法
平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,
若是,则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的
旋转,使之成为新的平衡子树。具体步骤如下:
⑴ 每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,
若该结点的祖先结点的平衡因子的绝对值均不超过1,则平衡二叉树没有失去平衡,继续插入结点;
⑵ 若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点;
⑶ 判断新插入的结点与最小不平衡子树的根结点的关系,确定是哪种类型的调整;
⑷ 如果是LL型或RR型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或LR型,
则需应用扁担原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋
转过程中,如果出现冲突,应用旋转优先原则调整冲突;
⑸ 计算调整后的平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,
以及调整后的平衡二叉树中是否存在平衡因子大于1的结点。
2.完全二叉树(Complete Binary Tree)
若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层从右向左连续缺若干结点,这就是完全二叉树。
3.满二叉树(Full Binary Tree)
一棵深度为h且有 2^h-1个结点的二叉树。
4.红黑树
红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。
它是在1972年由Rudolf Bayer发明的,他称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇
论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的:
它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。
红黑树是一种很有意思的平衡检索树。
它的统计性能要好于平衡二叉树(有些书籍根据作者姓名,Adelson-Velskii和Landis,将其称为AVL-树),
因此,红黑树在很多地方都有应用。在C++ STL中,很多部分(目前包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,
这些修改提供了更好的性能,以及对set操作的支持)。
红黑树是每个节点都有颜色特性的二叉查找树,颜色的值是红色或黑色之一。除了二叉查找树带有的一般要求,
我们对任何有效的红黑树加以如下增补要求:
1.节点是红色或黑色。
2.根是黑色。
3.每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
4.从每个叶子到根的所有路径都包含相同数目的黑色节点。
这些约束强制了红黑树的关键属性:
从根到叶子的最长的可能路径不大于最短的可能路径的两倍长。
结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值都要求与树的高度成比例的最坏情况时间,
这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。
在很多树数据结构的表示中,一个节点有可能只有一个儿子,而叶子节点包含数据。
用这种范例表示红黑树是可能的,但是这会改变一些属性并使算法复杂。为此,本文中我们使用 "null 叶子"
或"空(null)叶子",如上图所示,它不包含数据而只充当树在此结束的指示。这些节点在绘图中经常被省略,
导致了这些树好像同上述原则相矛盾,而实际上不是这样。与此有关的结论是所有节点都有两个儿子,尽管其中的一个或两个可能是空叶子。
分享到:
相关推荐
最小生成树是指在一个加权无向图中,找到一棵包括所有顶点的树,使得树的所有边的权重之和尽可能小。构建最小生成树的目的是以最低的成本连接所有顶点,同时保持树的结构。在实际应用中,这可以用来确定铺设电缆或...
在计算机科学中,数据结构是指计算机中组织和存储数据的方式,包括数组、链表、栈、队列、树、图等。图是一种非线性数据结构, 由节点和边组成,节点之间通过边相连。最小生成树是图论中一个重要的概念,它是指给定...
在这个压缩包中,我们很可能会找到如数组、链表、栈、队列、树、图以及哈希表等数据结构的典型代码示例。 1. **数组**:数组是最基础的数据结构,它是一个相同类型元素的集合,可以通过索引来访问每个元素。C语言中...
本文从多个角度介绍了Java数据结构中的树形结构,不仅涵盖了树的基本概念,还包括了如何在Java中实现树形数据结构的具体代码示例。此外,还讨论了树在实际应用场景中的作用以及常见的遍历方法。希望读者能够通过本文...
"C语言数据结构和常用算法"这个主题涵盖了编程中的基础且至关重要的概念,是任何程序员都需要掌握的核心技能。 数据结构是组织和管理数据的方式,它决定了数据在内存中的布局以及访问和操作数据的效率。在C语言中,...
本教程“现代计算机常用数据结构和算法”旨在帮助学习者深入理解这些概念,并提升其编程能力。 数据结构主要包括数组、链表、栈、队列、树、图、哈希表等。数组是最基本的数据结构,它提供了一种方式来存储和访问...
"动态序列与动态树问题——浅谈几种常用数据结构" 本文主要讨论了动态序列问题和动态树问题的解决方法,通过介绍了几种常用的平衡二叉树型数据结构来解决这些问题。动态序列问题是指在一个序列上执行一系列在线操作...
在数据结构中,树是一种非线性数据结构,它以分层的方式表示元素之间的关系,每个元素称为节点,而节点之间的连接被称为边。在本章“数据结构第三章:树”中,我们将深入探讨树的各种类型、操作和应用。 首先,我们...
数据结构是计算机科学中至关重要的基础概念,它研究如何有效地组织和存储数据,以便于高效地访问和操作。本文将对数据结构的经典算法进行详细解析,帮助理解和掌握这些核心概念。 首先,我们要明确数据和数据元素的...
本专题讲座旨在介绍数据结构的基本概念及其在实际编程中的应用。通过理解数据结构的基本原理,可以帮助程序员更好地解决实际问题。 #### 二、数据结构基本概念 1. **疑惑解答** - 学习完C语言后仍然无法写出代码,...
在这个“数据结构课设 树的应用”中,我们主要关注的是树这种数据结构及其在实际问题中的应用。 树是一种非线性的数据结构,它由若干个节点(也称为顶点)和连接这些节点的边构成。每个节点可以有零个或多个子节点...
本资料包“C语言常用数据结构注解”聚焦于C语言中的数据结构,特别是二叉树和八皇后问题,这些都是数据结构领域的经典主题。 首先,我们要了解数据结构的基本概念。数据结构是计算机存储、组织数据的方式,它决定了...
以下是对"数据结构常用程序源代码"这个资源的详细解析: 1. **串**:串是字符的序列,是基本的数据结构之一。在C++或Java等语言中,通常使用数组或链表来实现串。这些源代码可能会包含对字符串的各种操作,如插入、...
数据结构》(C语言版)的第1章综述数据、数据结构和抽象...其内容和章节编排1992年4月出版的《数据结构》(第二版)基本一致,但在本书中更突出了抽象数据类型的概念。全书采用类C语言作为数据结构和算法的描述语言。
递归算法是数据结构中最常用的算法之一,它通过函数自我调用来简化问题求解过程,尤其适用于链表或树形结构的遍历和排序问题。递归算法的例子包括计算阶乘和遍历二叉树。递归的关键在于将大问题分解成小问题,并最终...
数据结构是计算机科学中用来存储和组织数据的一种方式,它是计算机程序设计的基础之一。在深入探讨数据结构之前,我们需要了解一些基本概念,这些概念包括数据集合、数据元素、数据项、数据对象、数据结构、逻辑结构...
数据结构实验报告主要关注了树和二叉树的相关知识,包括它们的概念、存储结构、操作算法以及应用。以下是这些知识点的详细说明: 1. **树的基本概念**:树是一种非线性的数据结构,由节点(顶点)和边组成,其中每...
数据结构是计算机科学中的核心课程之一,主要研究如何在计算机中高效地组织和管理数据,以便进行各种操作,如搜索、排序、存储等。在这个领域,C语言常被用来实现这些数据结构,因为它提供了底层的内存管理和控制。...
数据结构与常用算法是计算机科学中的核心概念,它们在编程和软件开发中起着至关重要的作用。数据结构是指组织和存储数据的方式,以便更有效地访问和管理这些数据。而算法则是解决问题或执行任务的精确步骤集,它们...