1 / 167

树的逻辑结构 树的存储结构 二叉树的逻辑结构 二叉树的存储结构及实现 树、森林与二叉树的转换 哈夫曼树

第 5 章 树和二叉树. 本章的主要内容是. 树的逻辑结构 树的存储结构 二叉树的逻辑结构 二叉树的存储结构及实现 树、森林与二叉树的转换 哈夫曼树. 5.1 树的逻辑结构. 树的定义. 树: n ( n ≥ 0 ) 个 结点 的有限 集合 。当 n = 0 时,称为空树;任意一棵非空树满足以下条件: ⑴ 有且仅有一个特定的称为 根 的结点; ⑵ 当 n > 1 时,除根结点之外的其余结点被分成 m ( m >0 ) 个 互不相交 的有限集合 T 1 , T 2 , … , T m , 其中每个集合又是一棵树,并称为这个根结点的 子树 。.

lotte
Download Presentation

树的逻辑结构 树的存储结构 二叉树的逻辑结构 二叉树的存储结构及实现 树、森林与二叉树的转换 哈夫曼树

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第 5 章 树和二叉树 本章的主要内容是 • 树的逻辑结构 • 树的存储结构 • 二叉树的逻辑结构 • 二叉树的存储结构及实现 • 树、森林与二叉树的转换 • 哈夫曼树

  2. 5.1 树的逻辑结构 树的定义 树:n(n≥0)个结点的有限集合。当n=0时,称为空树;任意一棵非空树满足以下条件: ⑴有且仅有一个特定的称为根的结点; ⑵当n>1时,除根结点之外的其余结点被分成m(m>0)个互不相交的有限集合T1,T2,… ,Tm,其中每个集合又是一棵树,并称为这个根结点的子树。 树的定义是采用递归方法

  3. A A A B B C C B E C G G F F D E D G F D H I 5.1 树的逻辑结构 树的定义 (a) 一棵树结构 (b)一个非树结构 (c)一个非树结构

  4. My Computer C: D: etc E: …… …… …… …… Music Picture Program Files WINDOWS …… …… …… …… 5.1 树的逻辑结构 树的应用举例——文件结构

  5. A C B D E F G H I J K L M 5.1 树的逻辑结构 树的基本术语 结点的度:结点所拥有的子树的个数。 树的度:树中各结点度的最大值。

  6. A C B D E F H J G I K M L 5.1 树的逻辑结构 树的基本术语 叶子结点:度为0的结点,也称为终端结点。 分支结点:度不为0的结点,也称为非终端结点。

  7. A C B D E H F G J I K L M 5.1 树的逻辑结构 树的基本术语 孩子、双亲:树中某结点子树的根结点称为这个结点的孩子结点,这个结点称为它孩子结点的双亲结点; 兄弟:具有同一个双亲的孩子结点互称为兄弟。

  8. A C B D E F G H I J K M L 5.1 树的逻辑结构 树的基本术语 路径:如果树的结点序列n1, n2, …, nk有如下关系:结点ni是ni+1的双亲(1<=i<k),则把n1, n2, …, nk称为一条由n1至nk的路径;路径上经过的边的个数称为路径长度。

  9. A C B D E F G H I J K M L 5.1 树的逻辑结构 树的基本术语 祖先、子孙:在树中,如果有一条路径从结点x到结点y,那么x就称为y的祖先,而y称为x的子孙。

  10. 1层 C 2层 C B D 高度=4 3层 E F G H I J 4层 K M L 5.1 树的逻辑结构 树的基本术语 结点所在层数:根结点的层数为1;对其余任何结点,若某结点在第k层,则其孩子结点在第k+1层。 树的深度:树中所有结点的最大层数,也称高度。

  11. 1 A 2 4 3 C B D 5 6 7 8 E F H J 9 10 K L 5.1 树的逻辑结构 树的基本术语 层序编号:将树中结点按照从上层到下层、同层从左到右的次序依次给他们编以从1开始的连续自然数。

  12. A A B B C C G G F F D E D E 5.1 树的逻辑结构 树的基本术语 有序树、无序树:如果一棵树中结点的各子树从左到右是有次序的,称这棵树为有序树;反之,称为无序树。 数据结构中讨论的一般都是有序树

  13. A C B D E F H J K L 5.1 树的逻辑结构 树的基本术语 森林:m (m≥0)棵互不相交的树的集合。

  14. A D B E C A C G F F G D E B 5.1 树的逻辑结构 树的基本术语 同构:对两棵树,若通过对结点适当地重命名,就可以使这两棵树完全相等(结点对应相等,结点对应关系也相等),则称这两棵树同构。

  15. 第一个数据元素 根结点(只有一个) 叶子结点(可以有多个) 最后一个数据元素 其它数据元素 其它结点 5.1 树的逻辑结构 树结构和线性结构的比较 树结构 线性结构 无双亲 无前驱 无后继 无孩子 一个前驱,一个后继 一个双亲,多个孩子 一对一 一对多

  16. 5.1 树的逻辑结构 树的抽象数据类型定义 ADT Tree Data 树是由一个根结点和若干棵子树构成, 树中结点具有相同数据类型及层次关系 Operation InitTree 前置条件:树不存在 输入:无 功能:初始化一棵树 输出:无 后置条件:构造一个空树

  17. 5.1 树的逻辑结构 树的抽象数据类型定义 DestroyTree 前置条件:树已存在 输入:无 功能:销毁一棵树 输出:无 后置条件:释放该树占用的存储空间 Root 前置条件:树已存在 输入:无 功能:求树的根结点 输出:树的根结点的信息 后置条件:树保持不变

  18. 5.1 树的逻辑结构 树的抽象数据类型定义 Parent 前置条件:树已存在 输入:结点x 功能:求结点x的双亲 输出:结点x的双亲的信息 后置条件:树保持不变 Depth 前置条件:树已存在 输入:无 功能:求树的深度 输出:树的深度 后置条件:树保持不变

  19. 5.1 树的逻辑结构 树的抽象数据类型定义 PreOrder 前置条件:树已存在 输入:无 功能:前序遍历树 输出:树的前序遍历序列 后置条件:树保持不变 PostOrder 前置条件:树已存在 输入:无 功能:后序遍历树 输出:树的后序遍历序列 后置条件:树保持不变 endADT

  20. 如何理解访问? 遍历的实质? 如何理解次序? 5.1 树的逻辑结构 树的遍历操作 树的遍历:从根结点出发,按照某种次序访问树中所有结点,使得每个结点被访问一次且仅被访问一次。 抽象操作,可以是对结点进行的各种处理,这里简化为输出结点的数据。 树结构(非线性结构)→线性结构。 树通常有前序(根)遍历、后序(根)遍历和层序(次)遍历三种方式。

  21. A B C G F D E H I 5.1 树的逻辑结构 前序遍历 树的前序遍历操作定义为: 若树为空,则空操作返回;否则 ⑴ 访问根结点; ⑵按照从左到右的顺序前序遍历根结点的每一棵子树。 前序遍历序列: A B D E H I F C G

  22. A B C G F D E H I 5.1 树的逻辑结构 后序遍历 树的后序遍历操作定义为: 若树为空,则空操作返回;否则 ⑴ 按照从左到右的顺序后序遍历根结点的每一棵子树; ⑵访问根结点。 后序遍历序列: D H I E F B G C A

  23. A B C G F D E H I 5.1 树的逻辑结构 层序遍历 树的层序遍历操作定义为: 从树的第一层(即根结点)开始,自上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。 层序遍历序列: A B C D E F G H I

  24. 实现树的存储结构,关键是什么? 什么是存储结构? 树中结点之间的逻辑关系是什么? 5.2 树的存储结构 如何表示树中结点之间的逻辑关系。 数据元素以及数据元素之间的逻辑关系在存储器中的表示。 思考问题的出发点:如何表示结点的双亲和孩子

  25. data parent data:存储树中结点的数据信息 parent:存储该结点的双亲在数组中的下标 5.2 树的存储结构 双亲表示法 基本思想:用一维数组来存储树的各个结点(一般按层序存储),数组中的一个元素对应树中的一个结点,包括结点的数据信息以及该结点的双亲在数组中的下标。

  26. data parent 5.2 树的存储结构 双亲表示法 template <class T> struct PNode { T data; //数据域 int parent; //指针域,双亲在数组中的下标 } ; 树的双亲表示法实质上是一个静态链表。

  27. 0 1 2 3 4 5 6 7 8 A -1 B 0 C 0 D 1 E 1 F 1 G 2 H 2 I 4 A B C D E F G H I 如何查找双亲结点?时间性能? 5.2 树的存储结构 双亲表示法 下标data parent

  28. 0 1 2 3 4 5 6 7 8 A -1 B 0 C 0 D 1 E 1 F 1 G 2 H 2 I 4 1 3 6 -1 8 -1 -1 -1 -1 A B C D E F G H I 如何查找孩子结点?时间性能? 5.2 树的存储结构 双亲表示法 下标data parent firstchild

  29. 0 1 2 3 4 5 6 7 8 A -1 B 0 C 0 D 1 E 1 F 1 G 2 H 2 I 4 -1 2 -1 4 5 -1 7 -1 -1 A B C D E F G H I 如何查找兄弟结点?时间性能? 5.2 树的存储结构 双亲表示法 rightsib 下标data parent

  30. data child1 child2 …… childd 方案一:指针域的个数等于树的度 如何确定链表中的结点结构? 其中:data:数据域,存放该结点的数据信息; child1~childd:指针域,指向该结点的孩子。 5.2 树的存储结构 孩子链表表示法 链表中的每个结点包括一个数据域和多个指针域,每个指针域指向该结点的一个孩子结点。

  31. A B C D E F G H I 5.2 树的存储结构 缺点:浪费空间 A ∧ ∧ C B ∧ D E F G H ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ I ∧ ∧ ∧

  32. datadegreechild1child2 …… childd 如何确定链表中的结点结构? 5.2 树的存储结构 孩子链表表示法 链表中的每个结点包括一个数据域和多个指针域,每个指针域指向该结点的一个孩子结点。 方案二:指针域的个数等于该结点的度 其中:data:数据域,存放该结点的数据信息; degree:度域,存放该结点的度; child1~childd:指针域,指向该结点的孩子。

  33. A B C D E F G H I 5.2 树的存储结构 缺点:结点结构不一致 A 2 C 2 B 3 D 0 E 1 F 0 G 0 H 0 I 0

  34. 如何确定链表中的结点结构? 5.2 树的存储结构 孩子链表表示法 将结点的所有孩子放在一起,构成线性表。 基本思想:把每个结点的孩子排列起来,看成是一个线性表,且以单链表存储,则n个结点共有 n 个孩子链表。这 n 个单链表共有 n 个头指针,这 n 个头指针又组成了一个线性表,为了便于进行查找采用顺序存储。最后,将存放 n 个头指针的数组和存放n个结点的数组结合起来,构成孩子链表的表头数组。

  35. 孩子结点 child next 表头结点 data firstchild 5.2 树的存储结构 孩子链表表示法 struct CTNode { int child; CTNode *next; }; template <class T> struct CBNode { T data; CTNode *firstchild; };

  36. 如何查找孩子结点?时间性能? 1 2 ∧ A 3 4 5 ∧ 6 7 ∧ B C 8 ∧ D E F G H I 5.2 树的存储结构 下标data firstchild 0 1 2 3 4 5 6 7 8 A B C D E F G H I ∧ ∧ ∧ ∧ ∧

  37. 如何查找双亲结点?时间性能? 1 2 ∧ A 3 4 5 ∧ 6 7 ∧ B C 8 ∧ D E F G H I 5.2 树的存储结构 下标data firstchild 0 1 2 3 4 5 6 7 8 A B C D E F G H I ∧ ∧ ∧ ∧ ∧

  38. 1 2 ∧ data parent firstchild A 3 4 0 1 2 3 4 5 6 7 8 5 ∧ A -1 B 0 C 0 D 1∧ E 1 F 1 ∧ G 2∧ H 2∧ I4 ∧ 6 7 ∧ B C 8 ∧ D E F G H I 5.2 树的存储结构 双亲孩子表示法

  39. A B C D E F G H 设置两个分别指向该结点的第一个孩子和右兄弟的指针 I 5.2 树的存储结构 孩子兄弟表示法 某结点的第一个孩子是惟一的 某结点的右兄弟是惟一的

  40. firstchilddata rightsib 5.2 树的存储结构 孩子兄弟表示法 结点结构 data:数据域,存储该结点的数据信息; firstchild:指针域,指向该结点第一个孩子; rightsib:指针域,指向该结点的右兄弟结点。 template <class T> struct TNode { T data; TNode <T> *firstchild, *rightsib; };

  41. 如何查找兄弟结点?时间性能? A B C A ∧ D E F G H C B ∧ I F H D E G ∧ ∧ ∧ ∧ ∧ ∧ I ∧ ∧ 5.2 树的存储结构 孩子兄弟表示法

  42. 如何查找孩子结点?时间性能? A B C A ∧ D E F G H C B ∧ I F H D E G ∧ ∧ ∧ ∧ ∧ ∧ I ∧ ∧ 5.2 树的存储结构 孩子兄弟表示法

  43. 研究二叉树的意义? 5.3 二叉树的逻辑结构 问题转化:将树转换为二叉树,从而利用二叉树解决树的有关问题。 二叉树的定义 二叉树是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

  44. A B C D A E A F B B G 5.3 二叉树的逻辑结构 二叉树的特点: ⑴ 每个结点最多有两棵子树; ⑵ 二叉树是有序的,其次序不能任意颠倒。 注意:二叉树和树是两种树结构。

  45. Ф 右子树 只有一个根结点 空二叉树 根结点只有右子树 左子树 右子树 左子树 根结点同时有左右子树 根结点只有左子树 5.3 二叉树的逻辑结构 二叉树的基本形态

  46. 5.3 二叉树的逻辑结构 具有3个结点的树和具有3个结点的二叉树的形态 • 二叉树和树是两种树结构。

  47. A A B B C C 5.3 二叉树的逻辑结构 特殊的二叉树 斜树 1 .所有结点都只有左子树的二叉树称为左斜树; 2 .所有结点都只有右子树的二叉树称为右斜树; 3.左斜树和右斜树统称为斜树。 斜树的特点: 1. 在斜树中,每一层只有一个结点; 2.斜树的结点个数与其深度相同。

  48. 1 A 2 3 B C 4 5 6 7 D E G F H L M I J K N O 12 14 15 13 8 9 10 11 5.3 二叉树的逻辑结构 特殊的二叉树 满二叉树 在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上。 满二叉树的特点: • 叶子只能出现在最下一层; • 只有度为0和度为2的结点。

  49. 1 A 2 3 B C 4 5 6 7 D E G F L M 8 9 5.3 二叉树的逻辑结构 特殊的二叉树 满二叉树 不是满二叉树,虽然所有分支结点都有左右子树,但叶子不在同一层上。 满二叉树在同样深度的二叉树中结点个数最多 满二叉树在同样深度的二叉树中叶子结点个数最多

  50. 1 A 2 3 B C 4 5 6 7 D E G F H L M I J K N O 1 A 12 14 15 13 8 9 10 11 2 3 B C 4 5 6 7 D E G F H I J 8 9 10 5.3 二叉树的逻辑结构 特殊的二叉树 完全二叉树 对一棵具有n个结点的二叉树按层序编号,如果编号为i(1≤i≤n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同。

More Related