1.67k likes | 1.77k Views
第 5 章 树和二叉树. 本章的主要内容是. 树的逻辑结构 树的存储结构 二叉树的逻辑结构 二叉树的存储结构及实现 树、森林与二叉树的转换 哈夫曼树. 5.1 树的逻辑结构. 树的定义. 树: n ( n ≥ 0 ) 个 结点 的有限 集合 。当 n = 0 时,称为空树;任意一棵非空树满足以下条件: ⑴ 有且仅有一个特定的称为 根 的结点; ⑵ 当 n > 1 时,除根结点之外的其余结点被分成 m ( m >0 ) 个 互不相交 的有限集合 T 1 , T 2 , … , T m , 其中每个集合又是一棵树,并称为这个根结点的 子树 。.
E N D
第 5 章 树和二叉树 本章的主要内容是 • 树的逻辑结构 • 树的存储结构 • 二叉树的逻辑结构 • 二叉树的存储结构及实现 • 树、森林与二叉树的转换 • 哈夫曼树
5.1 树的逻辑结构 树的定义 树:n(n≥0)个结点的有限集合。当n=0时,称为空树;任意一棵非空树满足以下条件: ⑴有且仅有一个特定的称为根的结点; ⑵当n>1时,除根结点之外的其余结点被分成m(m>0)个互不相交的有限集合T1,T2,… ,Tm,其中每个集合又是一棵树,并称为这个根结点的子树。 树的定义是采用递归方法
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)一个非树结构
My Computer C: D: etc E: …… …… …… …… Music Picture Program Files WINDOWS …… …… …… …… 5.1 树的逻辑结构 树的应用举例——文件结构
A C B D E F G H I J K L M 5.1 树的逻辑结构 树的基本术语 结点的度:结点所拥有的子树的个数。 树的度:树中各结点度的最大值。
A C B D E F H J G I K M L 5.1 树的逻辑结构 树的基本术语 叶子结点:度为0的结点,也称为终端结点。 分支结点:度不为0的结点,也称为非终端结点。
A C B D E H F G J I K L M 5.1 树的逻辑结构 树的基本术语 孩子、双亲:树中某结点子树的根结点称为这个结点的孩子结点,这个结点称为它孩子结点的双亲结点; 兄弟:具有同一个双亲的孩子结点互称为兄弟。
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的路径;路径上经过的边的个数称为路径长度。
A C B D E F G H I J K M L 5.1 树的逻辑结构 树的基本术语 祖先、子孙:在树中,如果有一条路径从结点x到结点y,那么x就称为y的祖先,而y称为x的子孙。
1层 C 2层 C B D 高度=4 3层 E F G H I J 4层 K M L 5.1 树的逻辑结构 树的基本术语 结点所在层数:根结点的层数为1;对其余任何结点,若某结点在第k层,则其孩子结点在第k+1层。 树的深度:树中所有结点的最大层数,也称高度。
1 A 2 4 3 C B D 5 6 7 8 E F H J 9 10 K L 5.1 树的逻辑结构 树的基本术语 层序编号:将树中结点按照从上层到下层、同层从左到右的次序依次给他们编以从1开始的连续自然数。
A A B B C C G G F F D E D E 5.1 树的逻辑结构 树的基本术语 有序树、无序树:如果一棵树中结点的各子树从左到右是有次序的,称这棵树为有序树;反之,称为无序树。 数据结构中讨论的一般都是有序树
A C B D E F H J K L 5.1 树的逻辑结构 树的基本术语 森林:m (m≥0)棵互不相交的树的集合。
A D B E C A C G F F G D E B 5.1 树的逻辑结构 树的基本术语 同构:对两棵树,若通过对结点适当地重命名,就可以使这两棵树完全相等(结点对应相等,结点对应关系也相等),则称这两棵树同构。
第一个数据元素 根结点(只有一个) 叶子结点(可以有多个) 最后一个数据元素 其它数据元素 其它结点 5.1 树的逻辑结构 树结构和线性结构的比较 树结构 线性结构 无双亲 无前驱 无后继 无孩子 一个前驱,一个后继 一个双亲,多个孩子 一对一 一对多
5.1 树的逻辑结构 树的抽象数据类型定义 ADT Tree Data 树是由一个根结点和若干棵子树构成, 树中结点具有相同数据类型及层次关系 Operation InitTree 前置条件:树不存在 输入:无 功能:初始化一棵树 输出:无 后置条件:构造一个空树
5.1 树的逻辑结构 树的抽象数据类型定义 DestroyTree 前置条件:树已存在 输入:无 功能:销毁一棵树 输出:无 后置条件:释放该树占用的存储空间 Root 前置条件:树已存在 输入:无 功能:求树的根结点 输出:树的根结点的信息 后置条件:树保持不变
5.1 树的逻辑结构 树的抽象数据类型定义 Parent 前置条件:树已存在 输入:结点x 功能:求结点x的双亲 输出:结点x的双亲的信息 后置条件:树保持不变 Depth 前置条件:树已存在 输入:无 功能:求树的深度 输出:树的深度 后置条件:树保持不变
5.1 树的逻辑结构 树的抽象数据类型定义 PreOrder 前置条件:树已存在 输入:无 功能:前序遍历树 输出:树的前序遍历序列 后置条件:树保持不变 PostOrder 前置条件:树已存在 输入:无 功能:后序遍历树 输出:树的后序遍历序列 后置条件:树保持不变 endADT
如何理解访问? 遍历的实质? 如何理解次序? 5.1 树的逻辑结构 树的遍历操作 树的遍历:从根结点出发,按照某种次序访问树中所有结点,使得每个结点被访问一次且仅被访问一次。 抽象操作,可以是对结点进行的各种处理,这里简化为输出结点的数据。 树结构(非线性结构)→线性结构。 树通常有前序(根)遍历、后序(根)遍历和层序(次)遍历三种方式。
A B C G F D E H I 5.1 树的逻辑结构 前序遍历 树的前序遍历操作定义为: 若树为空,则空操作返回;否则 ⑴ 访问根结点; ⑵按照从左到右的顺序前序遍历根结点的每一棵子树。 前序遍历序列: A B D E H I F C G
A B C G F D E H I 5.1 树的逻辑结构 后序遍历 树的后序遍历操作定义为: 若树为空,则空操作返回;否则 ⑴ 按照从左到右的顺序后序遍历根结点的每一棵子树; ⑵访问根结点。 后序遍历序列: D H I E F B G C A
A B C G F D E H I 5.1 树的逻辑结构 层序遍历 树的层序遍历操作定义为: 从树的第一层(即根结点)开始,自上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。 层序遍历序列: A B C D E F G H I
实现树的存储结构,关键是什么? 什么是存储结构? 树中结点之间的逻辑关系是什么? 5.2 树的存储结构 如何表示树中结点之间的逻辑关系。 数据元素以及数据元素之间的逻辑关系在存储器中的表示。 思考问题的出发点:如何表示结点的双亲和孩子
data parent data:存储树中结点的数据信息 parent:存储该结点的双亲在数组中的下标 5.2 树的存储结构 双亲表示法 基本思想:用一维数组来存储树的各个结点(一般按层序存储),数组中的一个元素对应树中的一个结点,包括结点的数据信息以及该结点的双亲在数组中的下标。
data parent 5.2 树的存储结构 双亲表示法 template <class T> struct PNode { T data; //数据域 int parent; //指针域,双亲在数组中的下标 } ; 树的双亲表示法实质上是一个静态链表。
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
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
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
data child1 child2 …… childd 方案一:指针域的个数等于树的度 如何确定链表中的结点结构? 其中:data:数据域,存放该结点的数据信息; child1~childd:指针域,指向该结点的孩子。 5.2 树的存储结构 孩子链表表示法 链表中的每个结点包括一个数据域和多个指针域,每个指针域指向该结点的一个孩子结点。
A B C D E F G H I 5.2 树的存储结构 缺点:浪费空间 A ∧ ∧ C B ∧ D E F G H ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ I ∧ ∧ ∧
datadegreechild1child2 …… childd 如何确定链表中的结点结构? 5.2 树的存储结构 孩子链表表示法 链表中的每个结点包括一个数据域和多个指针域,每个指针域指向该结点的一个孩子结点。 方案二:指针域的个数等于该结点的度 其中:data:数据域,存放该结点的数据信息; degree:度域,存放该结点的度; child1~childd:指针域,指向该结点的孩子。
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
如何确定链表中的结点结构? 5.2 树的存储结构 孩子链表表示法 将结点的所有孩子放在一起,构成线性表。 基本思想:把每个结点的孩子排列起来,看成是一个线性表,且以单链表存储,则n个结点共有 n 个孩子链表。这 n 个单链表共有 n 个头指针,这 n 个头指针又组成了一个线性表,为了便于进行查找采用顺序存储。最后,将存放 n 个头指针的数组和存放n个结点的数组结合起来,构成孩子链表的表头数组。
孩子结点 child next 表头结点 data firstchild 5.2 树的存储结构 孩子链表表示法 struct CTNode { int child; CTNode *next; }; template <class T> struct CBNode { T data; CTNode *firstchild; };
如何查找孩子结点?时间性能? 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 ∧ ∧ ∧ ∧ ∧
如何查找双亲结点?时间性能? 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 ∧ ∧ ∧ ∧ ∧
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 树的存储结构 双亲孩子表示法
A B C D E F G H 设置两个分别指向该结点的第一个孩子和右兄弟的指针 I 5.2 树的存储结构 孩子兄弟表示法 某结点的第一个孩子是惟一的 某结点的右兄弟是惟一的
firstchilddata rightsib 5.2 树的存储结构 孩子兄弟表示法 结点结构 data:数据域,存储该结点的数据信息; firstchild:指针域,指向该结点第一个孩子; rightsib:指针域,指向该结点的右兄弟结点。 template <class T> struct TNode { T data; TNode <T> *firstchild, *rightsib; };
如何查找兄弟结点?时间性能? A B C A ∧ D E F G H C B ∧ I F H D E G ∧ ∧ ∧ ∧ ∧ ∧ I ∧ ∧ 5.2 树的存储结构 孩子兄弟表示法
如何查找孩子结点?时间性能? A B C A ∧ D E F G H C B ∧ I F H D E G ∧ ∧ ∧ ∧ ∧ ∧ I ∧ ∧ 5.2 树的存储结构 孩子兄弟表示法
研究二叉树的意义? 5.3 二叉树的逻辑结构 问题转化:将树转换为二叉树,从而利用二叉树解决树的有关问题。 二叉树的定义 二叉树是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。
A B C D A E A F B B G 5.3 二叉树的逻辑结构 二叉树的特点: ⑴ 每个结点最多有两棵子树; ⑵ 二叉树是有序的,其次序不能任意颠倒。 注意:二叉树和树是两种树结构。
Ф 右子树 只有一个根结点 空二叉树 根结点只有右子树 左子树 右子树 左子树 根结点同时有左右子树 根结点只有左子树 5.3 二叉树的逻辑结构 二叉树的基本形态
5.3 二叉树的逻辑结构 具有3个结点的树和具有3个结点的二叉树的形态 • 二叉树和树是两种树结构。
A A B B C C 5.3 二叉树的逻辑结构 特殊的二叉树 斜树 1 .所有结点都只有左子树的二叉树称为左斜树; 2 .所有结点都只有右子树的二叉树称为右斜树; 3.左斜树和右斜树统称为斜树。 斜树的特点: 1. 在斜树中,每一层只有一个结点; 2.斜树的结点个数与其深度相同。
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的结点。
1 A 2 3 B C 4 5 6 7 D E G F L M 8 9 5.3 二叉树的逻辑结构 特殊的二叉树 满二叉树 不是满二叉树,虽然所有分支结点都有左右子树,但叶子不在同一层上。 满二叉树在同样深度的二叉树中结点个数最多 满二叉树在同样深度的二叉树中叶子结点个数最多
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的结点在二叉树中的位置完全相同。