数据结构中有很多树的结构,其中包括二叉树、二叉搜索树、2-3树、红黑树等等。本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂。

文章目录

  • 1. 二叉树
  • 2. 二叉查找树
  • 3. 平衡二叉树
    • 3.1 平衡查找树之AVL树
    • 3.2 平衡二叉树之红黑树
  • 4. B树
  • 5. B+树
  • 6. B*树
  • 7. Trie树

1. 二叉树

二叉树是数据结构中一种重要的数据结构,也是树表家族最为基础的结构。

二叉树的定义:\textbf{二叉树的定义:}二叉树的定义:
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2i−12^{i-1}2i−1个结点;深度为k的二叉树至多有2k−12^k-12k−1个结点;对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。


二叉树的示例:\textbf{二叉树的示例:}二叉树的示例:


满二叉树和完全二叉树:\textbf{满二叉树和完全二叉树:}满二叉树和完全二叉树:
满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值,所有叶子结点必须在同一层上

满二叉树的性质:

1) 一颗树深度为h,最大层数为k,深度与最大层数相同,k=h;

2) 叶子数为2h2^h2h;

3) 第k层的结点数是:2k−12^{k-1}2k−1;

4) 总结点数是:2k−12^k-12k−1,且总节点数一定是奇数。

完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。

注:完全二叉树是效率很高的数据结构,堆是一种完全二叉树或者近似完全二叉树,所以效率极高,像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能优化,二叉排序树的效率也要借助平衡性来提高,而平衡性基于完全二叉树。


二叉树的性质:\textbf{二叉树的性质:}二叉树的性质:

1) 在非空二叉树中,第i层的结点总数不超过2i−12^{i-1}2i−1, i>=1;

2) 深度为h的二叉树最多有2h−12^h-12h−1个结点(h>=1),最少有h个结点;

3) 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;   
4)具有n个结点的完全二叉树的深度为log2(n+1);   
5)有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:
    若I为结点编号则 如果I>1,则其父结点的编号为I/2;
    如果2I<=N,则其左儿子(即左子树的根结点)的编号为2I;若2I>N,则无左儿子;
    如果2I+1<=N,则其右儿子的结点编号为2I+1;若2I+1>N,则无右儿子。  
6)给定N个节点,能构成h(N)种不同的二叉树,其中h(N)为卡特兰数的第N项,h(n)=C(2*n, n)/(n+1)。
7)设有i个枝点,I为所有枝点的道路长度总和,J为叶的道路长度总和J=I+2i。


2. 二叉查找树

二叉查找树的定义:\textbf{二叉查找树的定义:}二叉查找树的定义:

又称为是二叉排序树(Binary Sort Tree)或二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
  1) 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2) 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
  3) 左、右子树也分别为二叉排序树;
  4) 没有键值相等的节点。


二叉查找树的性质:\textbf{二叉查找树的性质:}二叉查找树的性质:
对二叉查找树进行中序遍历,即可得到有序的数列。


二叉查找树的时间复杂度:\textbf{二叉查找树的时间复杂度:}二叉查找树的时间复杂度:
它和二分查找一样,插入和查找的时间复杂度均为O(logn)O(logn)O(logn),但是在最坏的情况下仍然会有O(n)O(n)O(n)的时间复杂度。原因在于插入和删除元素的时候,树没有保持平衡。我们追求的是在最坏的情况下仍然有较好的时间复杂度,这就是平衡查找树设计的初衷。
  二叉查找树的高度决定了二叉查找树的查找效率。


二叉查找树的插入与删除:\textbf{二叉查找树的插入与删除:}二叉查找树的插入与删除:
二叉查找树的插入过程如下

1) 若当前的二叉查找树为空,则插入的元素为根节点;

2) 若插入的元素值小于根节点值,则将元素插入到左子树中;

3) 若插入的元素值不小于根节点值,则将元素插入到右子树中。

二叉查找树的删除,分三种情况进行处理:

1) p为叶子节点,直接删除该节点,再修改其父节点的指针(注意分是根节点和不是根节点),如图a;

2) p为单支节点(即只有左子树或右子树)。让p的子树与p的父亲节点相连,删除p即可(注意分是根节点和不是根节点),如图b;

3) p的左子树和右子树均不空。找到p的后继y,因为y一定没有左子树,所以可以删除y,并让y的父亲节点成为y的右子树的父亲节点,并用y的值代替p的值;或者方法二是找到p的前驱x,x一定没有右子树,所以可以删除x,并让x的父亲节点成为y的左子树的父亲节点。如图c。

3. 平衡二叉树

我们知道,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2nlog_2nlog2​n,其各操作的时间复杂度O(log2n)O(log_2n)O(log2​n)同时也由此而决定。但是,在某些极端的情况下(如在插入的序列是有序的时),二叉搜索树将退化成近似链或链,此时,其操作的时间复杂度将退化成线性的,即O(n)。我们可以通过随机化建立二叉搜索树来尽量的避免这种情况,但是在进行了多次的操作之后,由于在删除时,我们总是选择将待删除节点的后继代替它本身,这样就会造成总是右边的节点数目减少,以至于树向左偏沉。这同时也会造成树的平衡性受到破坏,提高它的操作的时间复杂度。于是就有了我们下边介绍的平衡二叉树。
平衡二叉树定义:\textbf{ 平衡二叉树定义:} 平衡二叉树定义:

平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用算法有红黑树、AVL树等。在平衡二叉搜索树中,我们可以看到,其高度一般都良好地维持在O(log2n)O(log_2n)O(log2​n),大大降低了操作的时间复杂度。

最小二叉平衡树的节点的公式如下:

F(n)=F(n−1)+F(n−2)+1F(n)=F(n-1)+F(n-2)+1F(n)=F(n−1)+F(n−2)+1

这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。

3.1 平衡查找树之AVL树

AVL树定义:\textbf{ AVL树定义:} AVL树定义:

AVL树是最先发明的自平衡二叉查找树。AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 “An algorithm for the organization of information” 中发表了它。在AVL中任何节点的两个儿子子树的高度最大差别为1,所以它也被称为高度平衡树,n个结点的AVL树最大深度约1.44log2n1.44log_2n1.44log2​n。查找、插入和删除在平均和最坏情况下都是O(log2n)O(log_2n)O(log2​n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(log2N)O(log_2N)O(log2​N)。但是频繁旋转会使插入和删除牺牲掉O(log2N)O(log_2N)O(log2​N)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。


AVL树的自平衡操作——旋转:\textbf{   AVL树的自平衡操作——旋转:}   AVL树的自平衡操作——旋转:
AVL树最关键的也是最难的一步操作就是旋转。旋转主要是为了实现AVL树在实施了插入和删除操作以后,树重新回到平衡的方法。下面我们重点研究一下AVL树的旋转。

对于一个平衡的节点,由于任意节点最多有两个儿子,因此高度不平衡时,此节点的两颗子树的高度差2.容易看出,这种不平衡出现在下面四种情况:

1) 6节点的左子树3节点高度比右子树7节点大2,左子树3节点的左子树1节点高度大于右子树4节点,这种情况成为左左。

2) 6节点的左子树2节点高度比右子树7节点大2,左子树2节点的左子树1节点高度小于右子树4节点,这种情况成为左右。

3) 2节点的左子树1节点高度比右子树5节点小2,右子树5节点的左子树3节点高度大于右子树6节点,这种情况成为右左。

4) 2节点的左子树1节点高度比右子树4节点小2,右子树4节点的左子树3节点高度小于右子树6节点,这种情况成为右右

从图2中可以可以看出,1和4两种情况是对称的,这两种情况的旋转算法是一致的,只需要经过一次旋转就可以达到目标,我们称之为单旋转。2和3两种情况也是对称的,这两种情况的旋转算法也是一致的,需要进行两次旋转,我们称之为双旋转。


单旋转\textbf{单旋转}单旋转
单旋转是针对于左左和右右这两种情况的解决方案,这两种情况是对称的,只要解决了左左这种情况,右右就很好办了。图3是左左情况的解决方案,节点k2不满足平衡特性,因为它的左子树k1比右子树Z深2层,而且k1子树中,更深的一层的是k1的左子树X子树,所以属于左左情况。

为使树恢复平衡,我们把k2变成这棵树的根节点,因为k2大于k1,把k2置于k1的右子树上,而原本在k1右子树的Y大于k1,小于k2,就把Y置于k2的左子树上,这样既满足了二叉查找树的性质,又满足了平衡二叉树的性质。

这样的操作只需要一部分指针改变,结果我们得到另外一颗二叉查找树,它是一棵AVL树,因为X向上一移动了一层,Y还停留在原来的层面上,Z向下移动了一层。整棵树的新高度和之前没有在左子树上插入的高度相同,插入操作使得X高度长高了。因此,由于这颗子树高度没有变化,所以通往根节点的路径就不需要继续旋转了。


双旋转\textbf{双旋转}双旋转
  对于左右和右左这两种情况,单旋转不能使它达到一个平衡状态,要经过两次旋转。双旋转是针对于这两种情况的解决方案,同样的,这样两种情况也是对称的,只要解决了左右这种情况,右左就很好办了。图4是左右情况的解决方案,节点k3不满足平衡特性,因为它的左子树k1比右子树Z深2层,而且k1子树中,更深的一层的是k1的右子树k2子树,所以属于左右情况。

  为使树恢复平衡,我们需要进行两步,第一步,把k1作为根,进行一次右右旋转,旋转之后就变成了左左情况,所以第二步再进行一次左左旋转,最后得到了一棵以k2为根的平衡二叉树。

3.2 平衡二叉树之红黑树

红黑树详细解析:https://www.jianshu.com/p/e136ec79235c
https://mp.weixin.qq.com/s?src=11&timestamp=1592808340&ver=2415&signature=B05etVYArMo6S6maEDI9MTi3LJvhxnyx7pn1X2zPw686OxnLwlGjpuk1gyJrO-D-GxDHgovAxUD70iMv7ayeuZ51QE5pduaSKNfzru8tQ7MZ9bop8BgGCTkwsMAdRK&new=1

当在10亿数据进行不到30次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀! —— 学红黑树有感。

红黑树的定义:\textbf{红黑树的定义:}红黑树的定义:
  红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由鲁道夫·贝尔发明的,称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(logn)O(logn)O(logn)时间内做查找,插入和删除,这里的n是树中元素的数目。

红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。这不只是使它们在时间敏感的应用如实时应用(real time application)中有价值,而且使它们有在提供最坏情况担保的其他数据结构中作为建造板块的价值;例如,在计算几何中使用的很多数据结构都可以基于红黑树。此外,红黑树还是2-3-4树的一种等同,它们的思想是一样的,只不过红黑树是2-3-4树用二叉树的形式表示的。


红黑树的性质:\textbf{红黑树的性质:}红黑树的性质:

红黑树,Red-Black Tree 「RBT」是一个自平衡(不是绝对的平衡,红黑树的平衡叫做黑色完美平衡)的二叉查找树(BST),树上的每个节点都遵循下面的规则,:

  1. 每个节点都有红色或黑色
  2. 树的根始终是黑色的 (黑土地孕育黑树根,

    [Data Structure] 数据结构中各种树相关推荐

    1. [数据结构]数据结构中各种树

      阅读目录 1. 二叉树 2. 二叉查找树 3. 平衡二叉树 3.1 平衡查找树之AVL树 3.2 平衡二叉树之红黑树 4. B树 5. B+树 6. B*树 7. Trie树 数据结构中有很多树的结构 ...

    2. react 递归遍历四层树结构 遍历分支中的最后一个节点_图解:数据结构中的 6 种树,你心中有数吗?...

      (给算法爱好者加星标,修炼编程内功) 来源:LemonCoder/后端技术学堂(本文来自作者投稿) 数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习 ...

    3. 图解:数据结构中的6种「树」,柠檬问你心中有数吗?

      数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习数据结构时候,会遇到各种各样的基础数据结构,比如堆栈.队列.数组.链表.树...这些基本的数据结构类 ...

    4. 图解:数据结构中的6种「树」,你心中有数吗?

      数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习数据结构时候,会遇到各种各样的基础数据结构,比如堆栈.队列.数组.链表.树...这些基本的数据结构类 ...

    5. 数据结构中常见的各种树原理详解(学习笔记)

      文章目录 01.回顾 1.树 02.二叉树 3.堆 堆排序 优先队列 索引优先队列 3.二叉搜索树(二叉查找树) 4.二叉平衡树(ALV) 02. 2-3查找树 2-3树的性质 03.红黑树 红黑树插 ...

    6. TRIE - Data Structure

      Introduction 介绍 Trie,又称单词查找树,是一种树形结构,用于保存大量的字符串.它的优点是:利用字符串的公共前缀来节约存储空间. Trie is an ordered tree dat ...

    7. Oracle DUL Data Unloader数据恢复工具信息汇总

      PRM-DUL是开放的ORACLE DUL 软件,点击下面的链接下载PRM-DUL DUL FOR LINUX平台(已更新为PRM-DUL) DUL FOR Windows平台 (已更新为PRM-DU ...

    8. 数据结构(Data Structure)(C/C++)PTA习题+课后习题

      课本:<数据结构--从概念到c++实现(第三版)> 第一章 绪论 1.1 判断题 1-1 数据元素是数据的最小单位. F         课本:数据元素是数据的基本单位:构成数据元素的最小 ...

    9. 数据结构中等号表示什么_通过分析2016年最重要的252个中等故事我学到了什么...

      数据结构中等号表示什么 Medium may be struggling to find a sustainable business model, but they have years worth ...

    最新文章

    1. 决策树算法十问及经典面试问题
    2. thrift RPC接口请求超时
    3. mysql连接失败 ping通_哭~问:oracle 数据库有时会突然连接失败,但能ping通主机...
    4. onclick进不去ajax,在ajax调用之后处理onclick函数
    5. php 生成饼状图,折线图,条形图 通用类
    6. java打印unicode_java程序实现Unicode码和中文互相转换
    7. 怎么看so文件是哪个aar引进来的_运城人才引进7月5号面试
    8. Vue中登陆超时,返回登陆页面
    9. Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)(转)
    10. 操作系统课程设计(linux操作系统)
    11. ionic app 开发学习
    12. win7搭建nas存储服务器_FreeNas 0.7.1:普通电脑变成网络存储服务器
    13. Kent Beck确认参加敏捷中国大会2009,讲述其35年架构设计心得
    14. 读论文,第十五天:FingerPing: Recognizing Fine-grained Hand Poses using Active Acoustic On-body Sensing
    15. 【spring】 官网文档手册(附中文网址)
    16. [VN2020 公开赛]simpleHeap-记录一次gef调试过程
    17. “城市大脑”治城一年 杭州“变”了
    18. 【推荐收藏】平面设计要求之印刷输出注意事项
    19. Kinect体感机器人(三)—— 空间向量法计算关节角度
    20. MATLAB 的函数

    热门文章

    1. Java进阶01-语法-徐磊
    2. 调用office web 365接口实现在线预览word文档,PDF,PPT
    3. 番外.李宏毅学习笔记.ST3.Structured SVM
    4. Axure原型创建折线、柱状等图形,引用echarts
    5. SWOT分析模型简介
    6. ios 渐变透明背景_【精灵课堂第11课】抖音超火iPhone 全透明动态壁纸,含完整教程...
    7. 图文详解:java时间轮定时器
    8. php中使用视频流的方式播放视频。
    9. SUMO仿真教程(1) ——安装环境的设置(Windows 10系统)
    10. 了解CSS盒模型、页面布局在UI设计中的作用