1.31k likes | 1.56k Views
第 7 章 树和二叉树. 特点:非线性结构,一个直接前驱,但可能有多个直接后继。(一对多或 1:n ) 7.1 树 7.2 二叉树 7.3 二叉树的设计与实现 7.4 遍历二叉树和线索二叉树 7.5 赫夫曼树及其应用 7.6 树与二叉树的转换. 主要内容. 知识点 树和二叉树定义 二叉树的性质,存储结构 二叉树的遍历及遍历算法的应用 ** 线索二叉树 二叉树和树及森林的关系 Huffman 树与 Huffman 编码 重点难点 二叉树的性质及应用 二叉树的遍历算法及应用 ** 线索二叉树的算法
E N D
第7章 树和二叉树 特点:非线性结构,一个直接前驱,但可能有多个直接后继。(一对多或1:n) 7.1 树 7.2 二叉树 7.3 二叉树的设计与实现 7.4 遍历二叉树和线索二叉树 7.5 赫夫曼树及其应用 7.6 树与二叉树的转换
主要内容 • 知识点 • 树和二叉树定义 • 二叉树的性质,存储结构 • 二叉树的遍历及遍历算法的应用 • ** 线索二叉树 • 二叉树和树及森林的关系 • Huffman树与Huffman编码 • 重点难点 • 二叉树的性质及应用 • 二叉树的遍历算法及应用 • ** 线索二叉树的算法 • Huffman树的构造方法
树的应用 • 如族谱、等级制度等
树的应用 • 目录组织
树的应用 • 文件系统、编译系统、目录组织等方面
树的应用 • 二叉排序树 • 网络中还用到了哈夫曼编码, 也是对树一种应用 • 树结构在客观世界中广泛存在。
7.1.1 树的定义 F G I J A B C E D H • 树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。 • (注:有人定义树不能为空) • 有且仅有一个称为根的结点(Root); • n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每个集合又是一棵树,称为子树(SubTree)
树的定义 树的递归定义的各子树T1,T2,…,Tm的相对次序是重要的,即树是有序的。
树定义(图示) T1 T2 T3
7.1.2 若干术语 A B C D L F F K G E H I J ——即根结点(没有前驱) ——即终端结点(没有后继) ——指m棵不相交的树的集合(例如删除A后的子树个数) 根 叶子结点 森林 有序树 无序树 ——结点各子树从左至右有序,不能互换(左为第一) ——结点各子树可互换位置。
7.1.2 若干术语 A B C D L F F K G E H I J ——即上层的那个结点(直接前驱) ——即下层结点的子树的根(直接后继) ——同一双亲下的同层结点(孩子之间互称兄弟) ——即从根到该结点所经分支的所有结点 ——即该结点下层子树中的任一结点 双亲结点 孩子结点 兄弟结点 祖先结点 子孙结点
A B C D L K F F G E H I J ——即树的数据元素 ——结点挂接的子树数 结点 结点的度 结点的层次 终端结点 分支结点 (有几个直接后继就是几度,亦称“次数”) ——从根到该结点的层数(根结点算第一层) ——即度为0的结点,即叶子 ——即度不为0的结点(也称为内部结点)
A B C D L K F F G E H I J ——所有结点度中的最大值(Max{各结点的度}) ——指所有结点中最大的层数(Max{各结点的层次}) 树的度 树的深度 (或高度) 13 问:右上图中的结点数= ;树的度= ;树的深度= 3 4
7.1.3 树的抽象数据类型 数据集合: 树的结点集合,每个结点由数据元素和构造数据元素之间关系的指针组成。 操作集合: (1)创建树 MakeTree(T) (2)撤消树 DestroyTree(T) (3)查找树中当前结点的双亲结点 Parent(T,curr) (4)查找树中当前结点的左孩子结点 LeftChild(T,curr) (5)查找树中当前结点的右孩子结点 RightSibling(T,curr) (6)遍历树 Traverse(T,Visit( ))
7.1.4 树的存储结构 树的结点之间的逻辑关系主要有双亲-孩子关系,兄弟关系。因此,从结点之间的逻辑关系分,树的存储结构主要有: (1)双亲表示法 (2)孩子表示法 (3)双亲孩子表示法 (4)孩子兄弟表示法
A B C F G D E H 1、双亲表示法 d p 0 1 2 3 4 5 6 (a)一棵树 (b)仿真指针的双亲表示法存储结构 图7.2 树的双亲表示法存储结构
2、孩子表示法 A 0 0 C B 0 0 0 0 1 G F E 1 D 1 1 1 0 1 0 H 1 1 I 1 1 图7.3 树的孩子法存储结构
从上面看出,树的操作实现比较复杂。 解决思路: 先研究最简单、最有规律的树,然后设法把一般的树转化为简单树。 最简单的树———二叉树
补充:树的5种表示法: • 图形表示法 • 嵌套集合表示法 • 广义表表示法 • 凹入表示法 • 左孩子-右兄弟表示法
图形表示法 …… 信息工程 计算机系 自控系 教师 学生 其他人员 2001级 2002级 2003级 2004级 广东药学院 根 …… 子树 叶子
广义表表示法 ( A ( B ( E ( K, L ), F ), C ( G ), D ( H ( M ), I, J ) ) 约定: 根作为由子树森林组成的表的名字写在表的左边
凹入表示法 又称目录表示法
... ... data link 1 link 2 link n 树结点的结构: 困惑:构造树的结点时应当开多少个链域?
data A 右兄弟 左孩子 D C B J I H G F E M L K 左孩子-右兄弟表示法 多叉树转为了二叉树
7.2 二叉树 7.2.1 二叉树的定义 7.2.2 二叉树的性质 7.2.3 二叉树的存储结构 为何要重点研究每结点最多只有两个 “叉” 的树? • 二叉树的结构最简单,规律性最强; • 可以证明,所有树都能转为唯一对应的二叉树,不失一般性。
7.2.1 二叉树的定义 一、二叉树:是n(n≥0)个结点的有限集合。n=0的树称为空二叉树;n>0的二叉树由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成 。 逻辑结构: 一对二(1:2) 基本特征: ① 每个结点最多只有两棵子树(不存在度大于2的结点); ② 左子树和右子树次序不能颠倒。 基本形态: 一般的树有几种? 问:具有3个结点的二叉树可能有几种不同形态? 有5种
7.2.2 二叉树的抽象数据类型 数据集合:二叉树的结点集合,每个结点由数据元素和构造数据元素之间关系的指针组成。 操作集合: (1)创建二叉树 MakeTree(T) (2)撤消二叉树 DestroyTree(T) (3)左插入结点 InsertLeftNode(curr,x) (4)右插入结点 InsertRightNode(curr,x) (5)左删除子树 DeleteLeftTree(curr) (6)右删除子树 DeleteRightTree(curr) (7)遍历二叉树 Traverse(T,Visit())
7.2.3二叉树的性质 29 1.一个非空二叉树的第i层上至多有2i个结点(i1) 证明:i = 1, 只有根结点,显然成立 设i = k时成立,最多有2k-1个结点 当i= k+1时,最多的结点个数: 2k-1 * 2 = 2k-1+1 = 2k = 2(k+1)-1
7.2.3二叉树的性质 证明:二叉树的结点个数为: 1 + 2 + … + 2k-1= 2k-1 30 2.深度为k的二叉树至多有2k-1个结点(k1)
7.2.3二叉树的性质 证明:设n1为T中度为1的结点数,则总结点数: n = n0 + n1 + n2 (1) 另:除根结点外,所有结点都有且仅有一个双亲结点,也就是仅有一个分支进入,若B为分支数,则 n=B+1 =n1 + 2 * n2+1 (2) 由(1)和(2)有: n1 + 2 * n2 + 1 = n0 + n1 + n2 故 n0 = n2 + 1; 31 3.对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
满二叉树 满二叉树 • 考虑到有序性,任一结点在树中都有确切的位置,因此可以对满二叉树进行编号。编号方式为:从上到下,从左到右。 满二叉树:深度为k且有2k-1个结点的二叉树
完全二叉树 完全二叉树 完全二叉树:深度为k,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树编号从1到n的结点一一对应时,称为完全二叉树。
完全二叉树的树形特征 • 特征: • 叶子结点只可能在层次最大的两层上出现。 • 任一结点,若其左分支下的子孙的最大层次为l,则其右分支下的最大层次为l或l-1,即若结点无左子女,决不应有右子女。
完全二叉树的特性(1) 1.具有n个结点的完全二叉树的深度: k = 证明:假设n个结点的完全二叉树的深度为k,则n的值应大于深度为k-1的满二叉树的结点数2k-1-1,小于等于深度为k的满二叉树的结点数2k-1,即 2k-1-1<n≤2k-1 进一步可推导出 2k-1<n+1≤2k 两边取对数后,有 k-1<log2(n+1)≤k 因为k是整数,所以有k= 35
完全二叉树的特性(2) 2.如果将一棵有n个结点的完全二叉树自顶向下,同一层自左向右连续给结点编号1,2,3,…,n,则对任一结点i(1in)有 (a)如果i=1,此结点为根结点,无双亲;若i>1,则其双亲结点是i/2。 (b)如果2i>n,则结点i无左孩子,i为叶子结点,否则其左孩子是结点2i。 (c)如果2i+1>n,则结点i无右孩子,否则其右孩子是结点2i+1。
完全二叉树的特性(2)的示意图 i/2 j层 i i+1 2i+3 j+1层 2i+1 2i+2 2i
完全二叉树的特性(2)的示意图 i/2 i i+1 2i+3 2i 2i+1 2i+2 LCHILD(i) LCHILD(i+1) RCHILD(i+1) RCHILD(i) 38
完全二叉树的树形特征 • 特征: • 叶子结点只可能在层次最大的两层上出现。 • 任一结点,若其左分支下的子孙的最大层次为l,则其右分支下的最大层次为l或l-1,即若结点无左子女,决不应有右子女。
(1)具有n个结点的非空二叉树的最小深度是多少?最大深度是多少?(2)具有n个结点的完全二叉树中有多少个叶子结点?有多少个度为2的结点?(3)具有n0个叶子结点的完全二叉树中共有多少个结点?(1)具有n个结点的非空二叉树的最小深度是多少?最大深度是多少?(2)具有n个结点的完全二叉树中有多少个叶子结点?有多少个度为2的结点?(3)具有n0个叶子结点的完全二叉树中共有多少个结点? 问题、针对二叉树,回答下列问题: 答:(1)其最小深度是log2(n+1)-1,最大深度是n。 (2)具有n个结点的完全二叉树中有n/2叶子结点,有n/2-1个度为2的结点。 (3)具有n0个叶子结点的完全二叉树中共有2n0个结点或2n0-1个结点。
练习: 一棵完全二叉树有1000个结点,则它必有个叶子结点,有个度为2的结点,有个结点只有非空左子树,有个结点只有非空右子树。 正确答案: 全部叶子数=1000/2 =500个。 度为2的结点=叶子总数-1=499个。 因为最后一个结点坐标是偶数,所以必为左子树。有 1 个结点只有非空左子树,有 0 个结点只有非空右子树。
完全二叉树性质的推论 n个结点的完全二叉树中: 度为1的结点数为(n+1)%2; 度为0的结点数为 (n+1)/2; 度为2的结点数为(n+1)/2-1; 编号最大的分支结点是n/2; 编号最小的叶子结点是n/2+1。 n个结点的二叉树: 高最多为n; 最低为 (完全二叉树)。
树的叶子数与其它结点数的关系 设度为m的树中度为0,1,2,…,m的结点数分别为n0, n1, n2,…, nm,结点总数为n,分枝数为B,则下面二式成立 n= n0+ n1+n2+…+nm (1) n=B+1= n1+2n2 +…+mnm (2) 由(1)和(2)得叶子结点数n0=1+
7.3 二叉树的设计和实现 7.3.1 二叉树的顺序存储结构 二叉树的存储结构主要有三种: 顺序存储结构 链式存储结构 仿真指针存储结构。
7.3 二叉树的设计和实现 1. 二叉树的顺序存储结构 完全二叉树的结点可按从上至下和从左至右的次序存储在一维数组中,其结点之间的关系可由公式计算得到,这就是二叉树的顺序存储结构。 数组 下标 0 1 2 3 4 5 6
顺序存储结构举例 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 完全二叉树
顺序存储结构举例 1 2 3 4 5 7 8 10 1 2 3 4 5 7 8 10 一般二叉树
问题:对于一般的二叉树如何存储呢? 显然不能直接使用二叉树的顺序存储结构。我们可以采取下面这种办法:首先在非完全二叉树中增添一些并不存在的空结点使之变成完全二叉树的形态,然后再用顺序存储结构存储。
数组 下标 0 1 2 3 4 5 6 7 8 9 10 11 12 (c) (a)一般二叉树 (b)完全二叉树 (c)在数组中的存储形式
2. 二叉树的链式存储结构 二叉树的链式存储结构是用指针建立二叉树中结点之间的关系。二叉树最常用的的链式存储结构是二叉链。二叉链存储结构的每个结点包含三个域,分别是数据域data、左孩子指针域leftChild和右孩子指针域rightChild。