【学习总结】《大话数据结构》- 第6章-树

【学习总结】《大话数据结构》- 总

启示:

  • 1265453-20190731203150916-2028695144.png

目录

  • 6.1 开场白
  • 6.2 树的定义
  • 6.3 树的抽象数据类型
  • 6.4 树的存储结构
  • 6.5 二叉树的定义
  • 6.6 二叉树的性质
  • 6.7 二叉树的存储结构
  • 6.8 遍历二叉树
  • 6.9 二叉树的建立
  • 6.10 线索二叉树
  • 6.11 树、森林与二叉树的转换
  • 6.12 赫夫曼树及其应用
  • 6.13 总结回顾
  • 6.14 结尾语

----------------------------------------------

6.1 开场白

  • 一些可以略过的场面话...

6.2 树的定义

  • 定义

    【学习总结】《大话数据结构》- 第6章-树_第1张图片
    【学习总结】《大话数据结构》- 第6章-树_第2张图片
    • 注意:

      • n>0时:根节点是唯一的,不可能存在多个根节点。

      • m>0时:子树的个数没有限制,但它们一定互不相交。

  • 结点分类

    • 结点的度(degree):结点拥有的子树数

    • 叶结点(leaf)或终结点:度为0的结点

    • 非终端结点或分支结点:度不为0的结点

    • 内部结点:除根节点外,分支结点也称为内部结点

    • 树的度:树内各结点的度的最大值

      【学习总结】《大话数据结构》- 第6章-树_第3张图片
  • 结点间关系

    • 孩子(child):结点的子树的根称为该结点的孩子

    • 双亲(parent):该结点称为孩子的双亲(父母同体,唯一的一个)

    • 兄弟(sibling):同一个双亲的孩子之间互称兄弟

    • 祖先:结点的祖先是从根到该结点所经分支上的所有结点

    • 子孙:以某结点为根的子树中的任一结点都称为该节点的子孙

      【学习总结】《大话数据结构》- 第6章-树_第4张图片
  • 树的其他相关概念

    • 层次(level):从根开始定义起,根为第一层,根的孩子为第二层

      即:若某结点在第L层,则其子树的根就在第L+1层

    • 堂兄弟:双亲在同一层的结点互为堂兄弟

    • 深度(depth)或高度:树中结点的最大层次称为树的深度或高度

      【学习总结】《大话数据结构》- 第6章-树_第5张图片
    • 有序树/无序树:如果将树中结点的各子树看成从左至右有次序的,不能互换的,则称该树为有序树,否则为无序树。

    • 森林(forest):m(m>=0)棵互不相交的树的集合。

      • 对于树中每个结点而言,其子树的集合即为森林。

  • 线性表与树的对比

    【学习总结】《大话数据结构》- 第6章-树_第6张图片

6.3 树的抽象数据类型

  • 相比线性结构,树的操作就完全不同了。以下是基本和常用操作。

    【学习总结】《大话数据结构》- 第6章-树_第7张图片

6.4 树的存储结构

  • 简单的顺序存储结构无法直接反映逻辑关系,不能满足树的实现要求

    故充分利用顺序存储和链式存储结构的特点,介绍三种不同的表示法

  • 双亲表示法

    • 引入:除根节点外,其余每个结点,不一定有孩子,但一定有且仅有一个双亲

    • 定义:设以一组连续空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点到链表中的位置。

      • data:数据域,存储结点的数据信息

      • parent:指针域,存储该结点的双亲在数组中的下标

      • 约定:根节点的位置域为-1

        1265453-20190801093913895-1212032738.png
    • 代码实现:

      【学习总结】《大话数据结构》- 第6章-树_第8张图片
      【学习总结】《大话数据结构》- 第6章-树_第9张图片
    • 图示:

      【学习总结】《大话数据结构》- 第6章-树_第10张图片【学习总结】《大话数据结构》- 第6章-树_第11张图片
    • 弊端:找一个结点的双亲,时间复杂度O(1),但是找一个结点的孩子,需要遍历整个结构

    • 针对上述找孩子的解决:增设一个结点最左边孩子的域(长子域),没有孩子的结点,长子域为-1

      • 2个孩子:知道长子是谁,另一个就是次子了

        【学习总结】《大话数据结构》- 第6章-树_第12张图片
    • 另一个问题:兄弟之间的关系 -- 增加一个右兄弟域来体现兄弟关系,没有右兄弟时为-1

      【学习总结】《大话数据结构》- 第6章-树_第13张图片
    • 同时关注结点的双亲、孩子、兄弟时:设置双亲域、长子域、右兄弟域

      但对时间遍历要求较高,有需要时再添加相应的结构

  • 孩子表示法

    • 多重链表表示法:

      • 每个结点有多个指针域,其中每个指针指向一棵子树的根节点,这种方法叫做多重链表表示法。

    • 方案一:设置指针域的个数为树的度

      • 可能存在空间的浪费

        【学习总结】《大话数据结构》- 第6章-树_第14张图片
        1265453-20190801100729437-454069286.png
        1265453-20190801100744291-1223971630.png
        【学习总结】《大话数据结构》- 第6章-树_第15张图片
    • 方案二:设置每个结点指针域的个数等于该结点的度,取一个位置来存储结点指针域的个数

      • 空间利用率提高,但是各个结点的链表结构不同,要维护结点的度的数值,时间损耗提高

        1265453-20190801101418724-1999722708.png
        1265453-20190801101429002-1036413297.png
        【学习总结】《大话数据结构》- 第6章-树_第16张图片
        【学习总结】《大话数据结构》- 第6章-树_第17张图片
    • 孩子表示法:

      • 把每个结点的孩子结点排列起来,以单链表作存储结构,则n个结点有n个孩子链表,如果是叶子结点,则此单链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中。

        【学习总结】《大话数据结构》- 第6章-树_第18张图片
        【学习总结】《大话数据结构》- 第6章-树_第19张图片
    • 孩子表示法的两种结点结构

      • 孩子链表的孩子结点

        1265453-20190801102616106-813553369.png
        1265453-20190801102631879-1074016235.png
      • 表头数组的表头结点

        1265453-20190801102706227-568694079.png
        1265453-20190801102658170-547399866.png
    • 孩子表示法的结构定义代码:

      【学习总结】《大话数据结构》- 第6章-树_第20张图片
      【学习总结】《大话数据结构》- 第6章-树_第21张图片
    • 孩子表示法的弊端:找某结点的双亲,仍需要遍历整个树

    • 改进:双亲孩子表示法

      【学习总结】《大话数据结构》- 第6章-树_第22张图片
  • 孩子兄弟表示法

    • 引入:

      任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。

      因此,可以设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟

      1265453-20190801103239370-925774100.png
      1265453-20190801103255785-1917792.png
    • 结构定义代码:

      【学习总结】《大话数据结构》- 第6章-树_第23张图片
    • 图示:

      【学习总结】《大话数据结构》- 第6章-树_第24张图片
      【学习总结】《大话数据结构》- 第6章-树_第25张图片
    • 弊端:找双亲仍需遍历整棵树,可以增加parent指针域

    • 好处:把一棵复杂的树变成了一棵二叉树

      【学习总结】《大话数据结构》- 第6章-树_第26张图片

6.5 二叉树的定义

  • 定义

    1265453-20190801104528158-421711731.png
    【学习总结】《大话数据结构》- 第6章-树_第27张图片

  • 1、二叉树的特点

    【学习总结】《大话数据结构》- 第6章-树_第28张图片
    1265453-20190801105257812-1076729136.png
    1265453-20190801105310510-270171802.png
    【学习总结】《大话数据结构》- 第6章-树_第29张图片

  • 2、特殊二叉树

    • 1-斜树:

      所有结点都只有左子树的二叉树叫左斜树

      所有结点都只有右子树的二叉树叫右斜树

      这两者统称为斜树。

      特点:每层只有一个结点,结点个数与二叉树的深度相同

      注:线性表结构可以理解为是树的一种极其特殊的表现形式

      【学习总结】《大话数据结构》- 第6章-树_第30张图片【学习总结】《大话数据结构》- 第6章-树_第31张图片
    • 2、满二叉树

      定义:一棵二叉树中,所有分支结点都存在左右子树,并且所有叶子都在同一层

      【学习总结】《大话数据结构》- 第6章-树_第32张图片

      特点:

      1265453-20190801110720214-584740104.png
    • 3、完全二叉树

      • 定义:对一棵具有n个结点的二叉树按层序编号,如果编号i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则此二叉树为完全二叉树

        完全二叉树示例:

        【学习总结】《大话数据结构》- 第6章-树_第33张图片

        非完全二叉树示例:

        【学习总结】《大话数据结构》- 第6章-树_第34张图片
      • 完全二叉树的特点:

        【学习总结】《大话数据结构》- 第6章-树_第35张图片
      • 完全二叉树的判断方法:给每个结点按满二叉树的结构逐层排序,如果编号出现空档,就不是,否则就是。

6.6 二叉树的性质

1265453-20190801125244402-59913586.png
1265453-20190801121508302-1934083547.png
1265453-20190801121539634-1592569481.png
1265453-20190801121559200-1356179314.png

  • 推导:

    1265453-20190801121952838-204320740.png
    1265453-20190801122010334-100523687.png
    【学习总结】《大话数据结构》- 第6章-树_第36张图片

1265453-20190801122055557-2134162618.png
1265453-20190801122107967-255145321.png

  • 简单推导:

    【学习总结】《大话数据结构》- 第6章-树_第37张图片
    【学习总结】《大话数据结构》- 第6章-树_第38张图片

1265453-20190801122717349-685804071.png
1265453-20190801122733669-768124377.png
【学习总结】《大话数据结构》- 第6章-树_第39张图片

  • 举例:

    【学习总结】《大话数据结构》- 第6章-树_第40张图片
    【学习总结】《大话数据结构》- 第6章-树_第41张图片

6.7 二叉树的存储结构

  • 二叉树的顺序存储结构:按完全二叉树编号

    • 顺序存储结构一般只用于完全二叉树,否则容易造成空间的浪费

    • 完全二叉树:

      【学习总结】《大话数据结构》- 第6章-树_第42张图片
      1265453-20190801125725329-1862504178.png
    • 一般二叉树:

      【学习总结】《大话数据结构》- 第6章-树_第43张图片
    • 极端情况的二叉树:

      【学习总结】《大话数据结构》- 第6章-树_第44张图片
  • 二叉链表

    • 定义:

      二叉树每个结点最多有两个孩子,所以设置一个数据域和两个指针域,这样的链表称为二叉链表。

      1265453-20190801130446605-912467472.png
      • data:数据域
      • lchild和lchild:指针域,分别存放指向左孩子和右孩子的指针。
    • 二叉链表的结点结构定义代码

      【学习总结】《大话数据结构》- 第6章-树_第45张图片
    • 图示:

      【学习总结】《大话数据结构》- 第6章-树_第46张图片
    • 三叉链表:

      • 如有需要,可增加一个指向其双亲的指针域,其称为三叉链表。

6.8 遍历二叉树

  • 二叉树遍历原理

    1265453-20190802231706986-554945735.png
    • 关键词:访问和次序

    • 访问:根据实际的需求来确定具体做什么,算作是一个抽象操作。

    • 遍历次序:

      • 线性结构最多是从头到尾、循环、双向等。

      • 树节点不存在唯一前驱后继,会因为遍历方式不同而产生完全不同的结果。

  • 二叉树遍历方法:

    • 四种:前序遍历、中序遍历、后序遍历、层序遍历。

    • 前序遍历:

      1265453-20190803093048120-340670453.png
      【学习总结】《大话数据结构》- 第6章-树_第47张图片
    • 中序遍历:

      1265453-20190803093406256-1389973085.png
      【学习总结】《大话数据结构》- 第6章-树_第48张图片
    • 后序遍历:

【学习总结】《大话数据结构》- 第6章-树_第49张图片

  • 层序遍历:

【学习总结】《大话数据结构》- 第6章-树_第50张图片

6.9 二叉树的建立

6.10 线索二叉树

6.11 树、森林与二叉树的转换

6.12 赫夫曼树及其应用

6.13 总结回顾

6.14 结尾语

END

转载于:https://www.cnblogs.com/anliux/p/11262015.html

你可能感兴趣的:(【学习总结】《大话数据结构》- 第6章-树)