收藏 分享(赏)

数据结构-第6章.ppt

上传人:hwpkd79526 文档编号:8269926 上传时间:2019-06-17 格式:PPT 页数:67 大小:757KB
下载 相关 举报
数据结构-第6章.ppt_第1页
第1页 / 共67页
数据结构-第6章.ppt_第2页
第2页 / 共67页
数据结构-第6章.ppt_第3页
第3页 / 共67页
数据结构-第6章.ppt_第4页
第4页 / 共67页
数据结构-第6章.ppt_第5页
第5页 / 共67页
点击查看更多>>
资源描述

1、16:50:50,1,第6章 树和二叉树,6.1 树的定义和基本术语 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林 6.5 树与等价问题 6.6 赫夫曼树及其应用 6.7 回溯法与树的遍历 6.8 树的计数,16:50:50,CH.6,2,6.1树的定义和基本术语,树(Tree)的定义: 树是n(n=0)个结点的有限集。在任意一棵非空树中: (1)有且仅有一个特定的称为根(Root)的结点; (2)当n1时,其余结点可分为m(m0)个互不相交的有限集T1,T2,.Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 (注意:上述的定义也是递归的。),16

2、:50:50,CH.6,3,6.1树的定义和基本术语,基本概念和术语 根、子树、结点、非终端结点(分支结点)、终端结点(叶结点)。,16:50:50,CH.6,4,6.1树的定义和基本术语,基本术语 树的结点(node) :包含一个数据元素及若干指向其子树的分支(或子树)。有根结点、叶结点、分支结点之分。 结点的度(degree) :结点的子树个数。 叶子(leaf)或终端结点:度为0的结点。 非终端结点或分支(branch)结点:度不为0的结点。 树的度(degree) :树中结点的最大度 。 孩子(child)和双亲(parent) :结点的子树的根称为该结点的孩子,相应地,该结点称为孩子

3、的双亲。,16:50:50,CH.6,5,6.1树的定义和基本术语,基本术语 兄弟(sibling) :同一个双亲的孩子结点之间互称兄弟结点。 结点的祖先(ancestor) :从根到该结点所经分支上的所有结点。 结点的子孙(descendant) :以某结点为根的子树中的任一结点都称为该结点的子孙。 结点的层次(level) :从根开始定义起,根为第一层,根的孩子为第二层。 堂兄弟:其双亲在同一层的结点互为堂兄弟。 树的深度(depth) 或高度:树中结点的最大层次。 有序树和无序树:如果将树中结点的各子树看成从左至右是有次序的,则称该树为有序树,否则称为无序树。 森林:是m(m=0)棵互不

4、相交的树的集合。,16:50:50,CH.6,6,6.1树的定义和基本术语,基本概念 根:树中无前驱的结点。 结点的度:后继结点的个数。 叶子或终端结点:无后继的结点。 非终端结点或分支结点:有后继的结点。 结点的直接后继是该结点的孩子(儿子)。 结点的直接前驱是该结点的双亲。 具有相同直接前驱的结点之间互称兄弟。 结点的祖先包括该结点所有的前驱结点。 结点的子孙包括该结点的所有的后继结点。,16:50:50,CH.6,7,6.1树的定义和基本术语,树的图示 结点分支图 集合、广义表表达式、凹入表示法(P120) 。,16:50:50,CH.6,8,树的表示,嵌套集合表示,嵌套括号表示,a (

5、 b ( d, e ( i, j ), f), c( g, h ) ),16:50:50,CH.6,9,6.1树的定义和基本术语,树的特征 每个结点至多有一个直接前驱,可以有多直接后继。 树能表示具有层次性的对象。,16:50:50,CH.6,10,6.2二叉树,6.2.1二叉树的定义 二叉树是另一种树型结构,它的特点是 每个结点至多只有二棵子树(即二叉树中不存在度大于2的结点)。 二叉树的子树有左右之分,其次序不能任意颠倒。,16:50:50,CH.6,11,6.2二叉树,二叉树可看成是一棵特殊的“树”: 树的结点个数有些定义规定至少为1,而二叉树的结点个数可以为0。 树中结点的最大度数没有

6、限制,二叉树结点最大度数为2。 一般有序树的结点只有先后之分,无左、右之分,二叉树的结点子树有明确的左、右之分。,16:50:50,CH.6,12,6.2.1二叉树的定义,ADT BinaryTree 数据对象D:D是具有相同特性的数据元素的集合。 数据关系R: 基本操作P: InitBiTree(,16:50:50,CH.6,13,6.2.1二叉树的定义,Assign(T, ADT BinaryTree,16:50:50,CH.6,14,6.2.1二叉树的定义,二叉树的五种形态:,16:50:50,CH.6,15,6.2.2二叉树的性质,性质: 在二叉树的第i层上至多有2的i-1次方个结点(

7、i=1)。,第三层上(i=3),有23-1=4个节点。 第四层上(i=4),有24-1=8个节点。,16:50:50,CH.6,16,6.2.2二叉树的性质,性质: 深度为k的二叉树至多有2的k次方减1个结点(k=1)。,此树的深度k=4,共有24-1=15个节点。,16:50:50,CH.6,17,6.2.2二叉树的性质,性质: 对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。,n0=n2+1=7+1=8,16:50:50,CH.6,18,6.2.2二叉树的性质,满二叉树: 一棵深度为k且有2k-1个结点的二叉树称为满二叉树。 特点:每一层上都含有最大结点

8、数。,16:50:50,CH.6,19,6.2.2二叉树的性质,完全二叉树: 按从上到下、从左到右给每个结点编号,如果有深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。 另外还有: 丰满二叉树、平衡二叉树,16:50:50,CH.6,20,6.2.2二叉树的性质,性质: 具有n个结点的完全二叉树的深度为log2n +1 性质: 如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任一结点i(1=1,则双亲PARENT(i)是结点i/2 (2)如果2in,则结点i无左孩子(结点i为叶子结点);否则其左孩子LCHILD(

9、i)是结点2i(3)如果2i+1n,则结点i无右孩子;否则其右孩子RCHILD(i)是结点2i+1,16:50:50,CH.6,21,6.2.3二叉树的存储结构,1.顺序存储结构(P126) 第i号结点的左右孩子一定保存在第2i及2i+1号单元中。 缺点:对非完全二叉树而言,浪费存储空间。,16:50:50,CH.6,22,6.2.3二叉树的存储结构,顺序存储结构类C语言描述 #define MAX_TREE_SIZE 100 typedef TElemType SqBiTreeMAX_TREE_SIZE; SqBiTree bt;,16:50:50,CH.6,23,6.2.3二叉树的存储结构

10、,2.链式存储结构 一个二叉树的结点应保存信息:数据元素、左孩子位置、右孩子位置或双亲位置。 对应地,链式存储二叉树的结点应包含:数据域、左、右指针域或双亲位置。,16:50:50,CH.6,24,6.2.3二叉树的存储结构,二叉链表和三叉链表,16:50:50,CH.6,25,6.2.3二叉树的存储结构,对结点有二个指针域的存储方式有以下表示方法(二叉链表): typedef struct BiTNode TElemType data; struct BiTNode *lchild,*rchild; BiTNode,*BiTree;,16:50:50,CH.6,26,6.2.3二叉树的存储结

11、构,基于该存储结构的二叉树基本操作有: Status CreateBiTree(BiTree /层序遍历二叉树T,对每个结点调用函数Visit一次且仅一次,16:50:50,CH.6,27,6.3遍历二叉树和线索二叉树,遍历二叉树:不重复地访问二叉树中每一个结点。 方法: 假如以L、D、R分别表示遍历左子树、遍历根结点和遍历右子树,遍历整个二叉树则有 DLR、LDR、LRD、DRL、RDL、RLD六种遍历方案。 若规定先左后右,则只有前三种情况,分别规定为: DLR先(根)序遍历,(或前(根)序遍历) LDR中(根)序遍历, LRD后(根)序遍历。 另外 层次遍历法。,16:50:50,CH.

12、6,28,6.3.1遍历二叉树,前序遍历二叉树算法: 若二叉树为空: 则退出; 否则: 访问根结点 (V); 前序遍历左子树 (L); 前序遍历右子树 (R)。,遍历结果 - (+ (a * (b - c d)( /( e f),16:50:50,CH.6,29,6.3.1遍历二叉树,中序遍历二叉树算法: 若二叉树为空: 则退出; 否则: 中序遍历左子树 (L); 访问根结点 (V); 中序遍历右子树 (R)。,遍历结果 (a + b * (c d)) -( e / f),16:50:50,CH.6,30,6.3.1遍历二叉树,后序遍历二叉树算法: 若二叉树为空: 则退出; 否则: 后序遍历左

13、子树 (L); 后序遍历右子树 (R); 访问根结点 (V)。,遍历结果 (a b c d - * +)( e f /) -,16:50:50,CH.6,31,6.3.1遍历二叉树,层次遍历二叉树算法: 若二叉树为空: 则退出; 否则,根结点入队.如队列不空,循环: 并作为当前结点;将当前结点的左右孩子入队; 做出队操作,队首元素作为当前结点。 最后,出队序列就是层序遍历 序列。,遍历结果 - (+ /)( a * e f) b - c d,16:50:50,CH.6,32,6.3.1遍历二叉树,递归法遍历二叉树(算法6.1) 先序: Status PreOrderTraverse(BiTre

14、e T,Status(*Visit)(TElemType e) if(T)if(Visit(T-data)if(PreOrderTraverse(t-lchild,Visit)if(PreOrderTraverse(T-rchild,Visit) return OK;return ERROR; else return OK; /PreOrderTraverse,Ifififif 头有些晕?,16:50:50,CH.6,33,6.3.1遍历二叉树,递归法遍历二叉树(算法6.1的改进) 先序: Status PreOrderTraverse(BiTree T, Status(*Visit) (TE

15、lemType e) if(T!=NULL)Visit(T-data);PreOrderTraverse(T-lchild,Visit);PreOrderTraverse(T-rchild,Visit); /PreOrderTraverse,16:50:50,CH.6,34,二叉树的几种递归算法,MAX(左,右)+1,右+1,左+1,1,0,深度,左+右+1,右+1,左+1,0,0,分支结点数,左+右+2,右+1,左+1,0,0,分支数,左+右,右子树,左子树,1,0,叶结点数,16:50:50,CH.6,35,6.3.1遍历二叉树,求二叉树的叶结点int leaf(BiTree T) if

16、(T = NULL) return(0);/形态0if (T-lchild = NULL) /形态2-4 /leaf,16:50:50,CH.6,36,6.3.1遍历二叉树,求二叉树的分支数 int branch(BiTree T) if (T = NULL) return(0);/形态0if (T-lchild = NULL) /形态4 /branch,16:50:50,CH.6,37,6.3.1遍历二叉树,求二叉树的深度 int depth(BiTree T) int dep1, dep2;if (T = NULL) return(0); /形态0else dep1 = depth(T-l

17、child);dep2 = depth(T-rchild);if (dep1 dep2) return(dep1 + 1);else return(dep2 + 1); /形态1-4 /depth,16:50:50,CH.6,38,6.3.2线索二叉树,问题提出 遍历操作可将二叉树的结点按线性排列输出。 当以二叉链表作为存储结构时,只能找到结点的左右孩子的信息,而不能在结点的任一序列的前驱与后继信息。 这种信息只有在遍历的动态过程中才能得到,为了能保存所需的信息,可增加标志域。,16:50:50,CH.6,39,6.3.2线索二叉树,要点: 增加标志域后的二叉链表叫做线索链表。 其中指向结点前

18、驱与后继的指针叫做线索。 加上线索的二叉树称之为线索二叉树。 对二叉树通过某种遍历操作使其成为线索二叉树的过程,称为线索化。 建立线索二叉树的一个重要用途是 根据当前结点,可快速找到其直接前驱和后继。,16:50:50,CH.6,40,6.4树和森林,6.4.1树的存储结构 6.4.2森林与二叉树的转换 6.4.3树和森林的遍历,16:50:50,CH.6,41,6.4.1树的存储结构,1.双亲表示 特点: 易找双亲,难找孩子。,16:50:50,CH.6,42,6.4.1树的存储结构,2.孩子(带双亲)链表 特点: 易找双亲和孩子。 树的度不易控制。,16:50:50,CH.6,43,6.4

19、.1树的存储结构,3.孩子兄弟表示法 特点:与二叉树类似,不易找双亲。,16:50:50,CH.6,44,6.4.1树的存储结构,4.广义表表示法 特点:与二叉树类似,不易找双亲和有些结点的孩子。,16:50:50,CH.6,45,6.4.2森林与二叉树的转换,森林与二叉树的对应关系,16:50:50,CH.6,46,6.4.2森林与二叉树的转换,森林转化成二叉树的规则 若F为空,即n = 0,则对应的二叉树B为空二叉树。 若F不空,则 对应二叉树B的根root (B)是F中第一棵树T1的根root (T1); 其左子树为B (T11, T12, , T1m),其中,T11, T12, , T

20、1m是root (T1)的子树; 其右子树为B (T2, T3, , Tn),其中,T2, T3, , Tn是除T1外其它树构成的森林。 特征: 左子树关系:父子关系(双亲与长子关系)。 右子树关系:兄弟关系。,16:50:50,CH.6,47,6.4.2森林与二叉树的转换,举例,16:50:50,CH.6,48,6.4.2森林与二叉树的转换,二叉树转换为森林的规则: 如果B为空,则对应的森林F也为空。 如果B非空,则 F中第一棵树T1的根为root; T1的根的子树森林 T11, T12, , T1m 是由 root 的左子树 LB 转换而来, F 中除了 T1 之外其余的树组成的森林 T2

21、, T3, , Tn 是由 root 的右子树 RB 转换而成的森林。,16:50:50,CH.6,49,6.4.2森林与二叉树的转换,二叉树转换为森林的具体方法: 若结点 x 是其双亲 y 的左孩子,则把 x 的右孩子,右孩子的右孩子,都与 y 用连线连起来,最后去掉所有双亲到右孩子的连线。,16:50:50,CH.6,50,6.4.3 树和森林的遍历,树的前序遍历 若树非空,则 1、访问根结点 2、依次前序遍历树的各子树,遍历序列: A,B,E,F,C,G,D,H,I,J,16:50:50,CH.6,51,6.4.3 树和森林的遍历,树的后序遍历 若树非空,则 1、依次后序遍历树的各子树

22、2、访问根结点,遍历序列: E,F,B,G,C,H,I,J, D,A,16:50:50,CH.6,52,6.4.3 树和森林的遍历,树的层次遍历 若树非空,则 依次各层的结点,遍历序列: A,B,C,D,E,F,G,H,I,J,16:50:50,CH.6,53,6.4.3 树和森林的遍历,注意: 前序遍历一棵树等价于前序遍历该树对应的二叉树。 后序遍历一棵树等价于中序遍历该树对应的二叉树。,A,B,E,F,C,G,D,H,I,J,16:50:50,CH.6,54,6.4.3 树和森林的遍历,对森林的遍历 可先将森林转换为二叉树。 然后按二叉树的方法进行遍历。,16:50:50,CH.6,55,

23、6.5 树与等价问题,(略),16:50:50,CH.6,56,6.6 赫夫曼树及其应用,6.6.1 最优二叉树(赫夫曼Huffman树) 有关术语 路径长度 (Path Length) 两个结点之间的路径长度是连接两结点的路径上的分支数。 树的路径长度是各叶结点到根结点的路径长度之和。 带权路径长度 ( Weighted Path Length, WPL ) 树的带权路径长度是树的各叶结点所带的权值与该结点到根的路径长度的乘积的和。,16:50:50,CH.6,57,6.6.1 最优二叉树(赫夫曼树),具有不同带权路径长度的二叉树,Huffman树带权路径长度达到最小的扩充二叉树(由n个权值

24、构造的n个叶结点的二叉树)即为Huffman树。在Huffman树中,权值大的结点离根最近。权值越小的结点离根结点越远。,16:50:50,CH.6,58,6.6.2 赫夫曼编码,Huffman算法 (1) 由给定的n个权值w0, w1, w2, , wn-1,构造具有n棵扩充二叉树的森林F = T0, T1, T2, , Tn-1,其中每一棵扩充二叉树Ti只有一个带有权值wi的根结点,其左、右子树均为空。 (2) 重复以下步骤, 直到F中仅剩下一棵树为止: 在F中选取两棵根结点的权值最小的扩充二叉树, 做为左、右子树构造一棵新的二叉树。置新的二叉树的根结点的权值为其左、右子树上根结点的权值之

25、和。 在F中删去这两棵二叉树。 把新的二叉树加入F。,16:50:50,CH.6,59,6.6.2 赫夫曼编码,Huffman算法图示,16:50:50,CH.6,60,6.6.2 赫夫曼编码,Huffman编码举例 某通信电文由5 个字母组成,它们的出现概率分别如下:如何来构造Huffman树和Huffman编码? 它们的平均码长为多少? 采用等长编码,则平均码长为多少?,16:50:50,CH.6,61,6.6.2 赫夫曼编码,Huffman树,Huffman编码,平均码长:0.25*2+0.15*3+0.2*2+0.28*2+0.12*3 0.5+0.45+0.4+0.56+0.24 2

26、.15,16:50:50,CH.6,62,6.7回溯法与树的遍历,(略),16:50:50,CH.6,63,6.8树的计数,证明:一棵二叉树的前序序列和中序序列可以唯一的确定这棵二叉树。 用归纳法证明: 1、当 n = 1时,结论显然成立; 2、假定当 n = k 时,结论成立; 3、当 n = k + 1 时,假定前序序列为和中序序列分别为: a1,am 和 b1, ,bm,16:50:50,CH.6,64,6.8树的计数,如中序序列中与前序序列a1相同的元素为bj。 j = 1时,二叉树无左子树,由 a2,am 和 b2, ,bm 可以唯一的确定二叉树的右子树; j = m时,二叉树无右子

27、树,由 a2,am 和 b1, ,bm-1 可以唯一的确定二叉树的左子树; 如2=j=m-1,则子序列 a2,aj 和 b1, ,bj-1唯一的确定二叉树的左子树;子序列aj+1,am 和 bj+1, ,bm唯一的确定二叉树的右子树。,16:50:50,CH.6,65,6.8 树的计数,a1,a2 , ,aj, aj+1, ,am,b1, ,bj-1,bj ,bj+1, ,bm ,唯一的确定左子树,唯一的确定右子树,个数相同,a1=bj,16:50:50,CH.6,66,6.8 树的计数,例, 前序序列 ABHFDECKG 和中序序列 HBDFAEKCG , 构造二叉树过程如下:,16:50:50,CH.6,67,第6章 知识点 *,61、树和二叉树的基本概念和术语 62、二叉树的性质 63、二叉树的顺序存储和二叉链表存储 64、二叉树的遍历 65、求二叉树的叶结点、分支结点、结点、深度、分支数 66、树、森林与二叉树的转换 67、 Huffman树的概念和构造 68、已知二叉树的前序序列和中序序列,求二叉树。*,Ch.7,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报