`

数据结构中常用树之概念

阅读更多

昨晚看到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)叶子",如上图所示,它不包含数据而只充当树在此结束的指示。这些节点在绘图中经常被省略,
 
 导致了这些树好像同上述原则相矛盾,而实际上不是这样。与此有关的结论是所有节点都有两个儿子,尽管其中的一个或两个可能是空叶子。

分享到:
评论

相关推荐

    一本C++的好书数据结构》(C语言版)的第1章综述数据、数据结构和抽象数据类型等基本概念;第2章至第7章从抽象数据类型的角度,分别讨论线性表、栈、队列、串、数组、广义表、树和二叉树以及图等基本类型的数据结构及其应用;第8章综合介绍操作系统和编译程序中涉及的动态存储管理的基本技术;第9章至第11章讨论查找和排序,除了介绍各种实现方法之外,并着重从时间上进行定性或定量的分析和比较;第12章介绍常用的文件结构。

    数据结构》(C语言版)的第1章综述数据、数据结构和抽象...其内容和章节编排1992年4月出版的《数据结构》(第二版)基本一致,但在本书中更突出了抽象数据类型的概念。全书采用类C语言作为数据结构和算法的描述语言。

    算法与数据结构习题答案+课件+参考资料 国防工业出版社 张永 李睿

     本书分为基本概念、简单数据结构(线性表、栈、队列)、复杂数据结构(树、图)和算法与数据结构应用(排序、查找、算法设计基础)四部分,详细介绍了常用数据结构和算法的基本概念及其不同的实现方法,对各种数据...

    数据结构c++版

    《数据结构(C++版)》介绍了学习数据结构所用到的预备知识,叙述了数据结构、算法以及抽象数据类型的概念,介绍了线性表、栈、队列和串、数组和广义表,树和二叉树、图等常用数据结构,讨论了常用的查找、排序和索引技术,...

    C++常用数据结构.rar

    常用数据结构(线性表、各类链表、散列表、栈和队列、树形结构、图型结构)的C++模板类方式实现, linux环境中通过编译测试(包含makefile和vscode工程文件) 仅供参考和交流学习,欢迎批评指正~

    数据结构与算法设计-王晓东PPT

    第7~12章讨论反映层次关系的数据结构树、表示集合的抽象数据类型、符号表以及散列表等实践中常用实现符号表的方法、字典及其实现方法、优先队列及其实现方法、并查集及其实现方法;第13章介绍非线性结构图及图的...

    C数据结构.ppt(详细讲解C数据结构和算法)

    介绍数据、数据结构和抽象数据类型的概念。 第二章 ~ 第七章 基本数据结构 从抽象数据类型的角度, 分别讨论线性表、栈和队列、串、数组和广义表、 树、图等基本数据结构及其应用。 第八章 动态存储管理 介绍...

    数据结构王红梅

     《数据结构(C++版)(第2版)》介绍了数据结构、算法以及抽象数据类型的概念,介绍了线性表、栈、队列和串、数组、树和二叉树、图等常用数据结构,讨论了常用的查找、排序和索引技术,给出了较多的数据结构的应用...

    数据结构案例教程(C语言版).rar

    《数据结构案例教程(C语言版)》系统地介绍了各种常用的数据结构,内容丰富,概念讲解清楚,叙述严谨流畅,逻辑性强。书中配备了大量的案例,每个案例都经过精心设计,既能帮助读者理解知识,又具有启发性。《数据...

    数据结构-树

    树是常用经典数据结构。定义、概念、性质。。。

    嵌入式系统软件设计中的数据结构

    书中基本内容有:常用线性数据结构在嵌入式系统中的实现和相关算法;树和图在嵌入式系统中的实现和相关算法;排序和查找算法等。  本书从嵌入式系统的实际硬件环境出发,用通俗易懂的语言代替枯燥难懂的理论解释,...

    数据结构使用C++标准模板库STL 陈本林版

    全书以C++标准模板库(STL)提供的容器类为基础,讨论向量、双端队列、表、栈、队列、树、图和散列表等各种常用的数据结构;讲述递归的实现和若干常用的排序算法。书中对讨论的每一种数据结构都给出了应用示例和运行...

    严蔚敏数据结构c语言版

    其内容和章节编排 1992年4月出版的《数据结构》(第二版)基本一致,但在本书中更突出了抽象数据类型的概念。全书采用类C语言作为数据结构和算法的描述语言。 本书概念表述严谨,逻辑推理严密,语言精炼,用词达意,...

    数据结构(C#)顺序表,栈,队列,图,树,查找,排序

    本书分为8章,第1章介绍了数据结构和算法的基本概念及本书用到的数学和C#的知 识;第2章至第6章分别讨论了线性表、栈和队列、串和数组、树型结构和图结构等常用的 数据结构及其应用,以及在.NET框架中相应的数据结构...

    数据结构(C语言版)

    "本书重点讨论了各种基本数据结构的类型描述、常用算法实现及其应用。全书共分9章:第1章主要介绍了有关数据结构的基本概念和术语;第2章~第7章分别讨论了线性表、栈和队列、串、数组和广义表、树及图等基本类型的...

    C#数据结构

    第二个是讲授常用的算法,这和数据结构一样,是人们在长期实践过程中的总结, 程序员可以直接拿来或经过少许的修改就可以使用。可以通过算法训练来提高程 序设计水平。第三个目的是通过程序设计的技能训练促进程序员...

    [数据结构(C语言版)].严蔚敏_吴伟民.扫描版

    其内容和章节编排 1992年4月出版的《数据结构》(第二版)基本一致,但在本书中更突出了抽象数据类型的概念。全书采用类C语言作为数据结构和算法的描述语言。 本书概念表述严谨,逻辑推理严密,语言精炼,用词达意,...

    数据结构(C#语言版)

    第二章至第六章分别讨论了线性表、栈和队列、串和数组、树形结构和图结构等常用的数据结构及其应用,以及在.NET架构中相应的数据结构;第7、8两章分别讨论了排序和查找常用的各种方法及其应用以及在.NET架构中相应的...

    C# 数据结构

    第二章至第六章分别讨论了线性表、栈和队列、串和数组、树形结构和图形结构等常用的数据结构及其应用,以及在.net框架中相应的数据结构;第七、八章分别讨论了排序和查找的各种方法及其应用以及应用在.net 框架中...

    《数据结构》习题答案

    第1章概述,主要介绍数据、数据结构和算法等基本概念。第2章至第6章分别讨论线性表、栈、队列、串、数组和广义表、树及图等基本类型的数据结构,内容包括它们的逻辑结构、存储结构以及在各种存储结构下相应运算的...

    数据结构教程

    本书的第1章综述数据、数据结构和抽象数据类型等基本概念;第2章至第7章从抽象数据类型的角度,分别讨论线性表、栈、队列、串、数组、广义表、树和二叉树以及图等基本类型的数据结构及其应用;第8章综合介绍操作系统...

Global site tag (gtag.js) - Google Analytics