资源预览内容
第1页 / 共95页
第2页 / 共95页
第3页 / 共95页
第4页 / 共95页
第5页 / 共95页
第6页 / 共95页
第7页 / 共95页
第8页 / 共95页
第9页 / 共95页
第10页 / 共95页
亲,该文档总共95页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,数据结构课程的内容,2,第6章 树和二叉树( Tree & Binary Tree ),6.1 树的基本概念 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林 6.5 赫夫曼树及其应用,3,6.1 树的基本概念,1. 树的定义 2. 若干术语 3. 逻辑结构 4. 存储结构 5. 树的运算,4,1. 树的定义,注1:过去许多书籍中都定义树为n1,曾经有“空树不是树”的说法,但现在树的定义已修改。 注2:树的定义具有递归性,即树中还有树。,由一个或多个(n0)结点组成的有限集合T,有且仅有一个结点称为根(root),当n1时,其余的结点分为m(m0)个互不相交的有限集合T1,T2,Tm。每个集合本身又是棵树,被称作这个根的子树 。,5,树的表示法有几种:,图形表示法 嵌套集合表示法 广义表表示法 目录表示法,6,树的抽象数据类型定义,(见教材P118-119),ADT Tree 数据对象D: 数据关系R: 基本操作 P: ADT Tree,若D为空集,则称为空树;/允许n=0 若D中仅含一个数据元素,则R为空集; 其他情况下的R存在二元关系: root 唯一 /关于根的说明 DjDk= /关于子树不相交的说明 /关于子树的子树不相交的说明,D是具有相同特性的数据元素的集合。,7,6.1 树的基本概念,1. 树的定义 2. 若干术语 3. 逻辑结构 4. 存储结构 5. 树的运算,8,2. 若干术语,即上层的那个结点(直接前驱) 即下层结点的子树的根(直接后继) 同一双亲下的同层结点(孩子之间互称兄弟) 即双亲位于同一层的结点(但并非同一双亲) 即从根到该结点所经分支的所有结点 即该结点下层子树中的任一结点,根 叶子 森林 有序树 无序树,即根结点(没有前驱) 即终端结点(没有后继) 指m棵不相交的树的集合(例如删除A后的子树个数),双亲 孩子 兄弟 堂兄弟 祖先 子孙,结点各子树从左至右有序,不能互换(左为第一) 结点各子树可互换位置。,9,2. 若干术语(续),即树的数据元素 结点挂接的子树数(有几个直接后继就是几度,亦称“次数”),结点 结点的度 结点的层次 终端结点 分支结点,树的度 树的深度 (或高度),从根到该结点的层数(根结点算第一层) 即度为0的结点,即叶子 即度不为0的结点(也称为内部结点),所有结点度中的最大值(Max各结点的度) 指所有结点中最大的层数(Max各结点的层次),问:右上图中的结点数 ;树的度 ;树的深度,13,3,4,10,6.1 树的基本概念,1. 树的定义 2. 若干术语 3. 逻辑结构 4. 存储结构 5. 树的运算,11,3. 树的逻辑结构,(特点): 一对多(1:n),有多个直接后继(如家谱树、目录树等等),但只有一个根结点,且子树之间互不相交。,12,6.1 树的基本概念,1. 树的定义 2. 若干术语 3. 逻辑结构 4. 存储结构 5. 树的运算,13,4. 树的存储结构,讨论1:树是非线性结构,该怎样存储? 仍然有顺序存储、链式存储等方式。,14,讨论3:树的链式存储方案应该怎样制定?,可规定为:从上至下、从左至右将树的结点依次存入内存。 重大缺陷:复原困难(不能唯一复原就没有实用价值)。,讨论2:树的顺序存储方案应该怎样制定?,可用多重链表:一个前趋指针,n个后继指针。 细节问题:树中结点的结构类型样式该如何设计? 即应该设计成“等长”还是“不等长”? 缺点:等长结构太浪费(每个结点的度不一定相同); 不等长结构太复杂(要定义好多种结构类型)。,解决思路:先研究最简单、最有规律的树,然后设法把一般的树转化为简单树。,15,6.1 树的基本概念,1. 树的定义 2. 若干术语 3. 逻辑结构 4. 存储结构 5. 树的运算,16,5. 树的运算,要明确: 1. 普通树(即多叉树)若不转化为二叉树,则运算很难实现。 2. 二叉树的运算仍然是插入、删除、修改、查找、排序等,但这些操作必须建立在对树结点能够“遍历”的基础上! (遍历指每个结点都被访问且仅访问一次,不遗漏不重复)。,17,第6章 树和二叉树( Tree & Binary Tree ),6.1 树的基本概念 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林 6.5 赫夫曼树及其应用,18,6.2 二叉树,为何要重点研究每结点最多只有两个 “叉” 的树? 二叉树的结构最简单,规律性最强; 可以证明,所有树都能转为唯一对应的二叉树。,1. 二叉树的定义 2. 二叉树的性质 3. 二叉树的存储结构,19,1. 二叉树的定义,定义:是n(n0)个结点的有限集合,由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成 。 逻辑结构: 一对二(1:2) 基本特征: 每个结点最多只有两棵子树(不存在度大于2的结点); 左子树和右子树次序不能颠倒(有序树)。 基本形态:,问:具有3个结点的二叉树可能有几种不同形态?普通树呢?,5种/2种,20,二叉树的抽象数据类型定义(见教材P121-122),ADT BinaryTree 数据对象D: 数据关系R: 基本操作 P: ADT BinaryTree,若D=,则R= ; 若D,则R= H;存在二元关系: root 唯一 /关于根的说明 DjDk= /关于子树不相交的说明 /关于根和左右子树有唯一联系的说明 /关于左子树和右子树的说明,D是具有相同特性的数据元素的集合。,21,6.2 二叉树,1. 二叉树的定义 2. 二叉树的性质 3. 二叉树的存储结构,22,2. 二叉树的性质 (3+2),讨论1:第i层的结点数至多是多少? (利用二进制性质可轻松求出),性质1: 在二叉树的第i层上至多有2i-1个结点(i0)。,性质2: 深度为k的二叉树至多有2k-1个结点(k0)。,2i-1个,提问:第i层上至少有 个结点?,1,讨论2:深度为k的二叉树,至多有多少个结点? (利用二进制性质可轻松求出),2k-1,提问:深度为k时至少有 个结点?,k,23,讨论3:二叉树的叶子数和度为2的结点数之间有关系吗?,性质3: 对于任何一棵二叉树,若2度的结点数有n2个,则叶子数(n0)必定为n21 (即n0=n2+1),证明: 二叉树中全部结点数nn0+n1+n2(叶子数1度结点数2度结点数) 又二叉树中全部结点数nB+1 ( 总分支数根结点 ) (除根结点外,每个结点必有一个直接前趋,即一个分支) 而 总分支数B= n1+2n2 (1度结点必有1个直接后继,2度结点必有2个) 三式联立可得: n0+n1+n2= n1+2n2 +1, 即n0=n2+1 实际意义:叶子数2度结点数1,24,对于两种特殊形式的二叉树(满二叉树和完全二叉树),还特别具备以下2个性质:,性质4: 具有n个结点的完全二叉树的深度必为 log2n 1,性质5: 对完全二叉树,若从上至下、从左至右编号,则编号为i 的结点,其左孩子编号必为2i,其右孩子编号必为2i1;其双亲的编号必为i/2(i1 时为根,除外)。,证明:根据性质2,深度为k的二叉树最多只有2k-1个结点,且完全二叉树的定义是与同深度的满二叉树前面编号相同,即它的总结点数n位于k层和k-1层满二叉树容量之间,即 2k-1-1n2k-1 或2k-1n2k 三边同时取对数,于是有:k-1log2nk 因为k是整数, 所以k= log2n +1,x -表示不大于x的最大整数 X -表示不小于x的最小整数,25,满二叉树:一棵深度为k 且有2k -1个结点的二叉树。 (特点:每层都“充满”了结点),完全二叉树:深度为k 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k 的满二叉树中编号从1至n的结点一一对应。,为何要研究这两种特殊形式? 因为它们在顺序存储方式下可以复原!,解释:完全二叉树的特点就是,只有最后一层叶子不满,且全部集中在左边。 这其实是顺序二叉树的含义。,26,3. 深度为9的二叉树中至少有 个结点。 )9 )8 ) )91,2.深度为k 的二叉树的结点总数,最多为 个。 )k-1 ) log2k ) k )k,课堂练习: 1. 树中各结点的度的最大值称为树的 。 ) 高度 ) 层次 ) 深度 ) 度,课堂讨论:,满二叉树和完全二叉树有什么区别? 答:满二叉树是叶子一个也不少的树,而完全二叉树虽然前n-1层是满的,但最底层却允许在右边缺少连续若干个结点。满二叉树是完全二叉树的一个特例。,27,6.2 二叉树,1. 二叉树的定义 2. 二叉树的性质 3. 二叉树的存储结构,28,3. 二叉树的存储结构,一、顺序存储结构 按二叉树的结点“自上而下、从左至右”编号,用一组连续的存储单元存储。,A B C D E F G H I,问:顺序存储后能否复原成唯一对应的二叉树形状? 答:若是完全/满二叉树则可以做到唯一复原。 而且有规律:下标值为i的双亲,其左孩子的下标值必为2i,其右孩子的下标值必为2i1(即性质5) 例如,对应2的两个孩子必为4和5,即B的左孩子必是D,右孩子必为E。,T0一般不用,29,讨论:不是完全二叉树怎么办?,答:一律转为完全二叉树! 方法很简单,将各层空缺处统统补上“虚结点”,其内容为空。,A B C D E,缺点:浪费空间;插入、删除不便,30,二、链式存储结构 用二叉链表即可方便表示。,二叉树结点数据类型定义: typedef struct node *tree_pointer; typedef struct node int data; tree_pointer left_child, right_child; node;,一般从根结点开始存储。 (相应地,访问树中结点时也只能从根开始) 注:如果需要倒查某结点的双亲,可以再增加一个双亲域(直接前趋)指针,将二叉链表变成三叉链表。,31,例:,32,第6章 树和二叉树( Tree & Binary Tree ),6.1 树的基本概念 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林 6.5 赫夫曼树及其应用,33,6.3 遍历二叉树和线索二叉树,一、遍历二叉树(Traversing Binary Tree) 二、线索二叉树(Threaded Binary Tree),34,遍历定义指按某条搜索路线遍访每个结点且不重复(又称周游)。 遍历用途它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。 遍历方法牢记一种约定,对每个结点的查看都是“先左后右” 。,一、遍历二叉树(Traversing Binary Tree),35,遍历规则,二叉树由根、左子树、右子树构成,定义为D、 L、R D、 L、R的组合定义了六种可能的遍历方案: LDR, LRD, DLR, DRL, RDL, RLD 若限定先左后右,则有三种实现方案: DLR LDR LRD 先 (根)序遍历 中 (根)序遍历 后(根)序遍历 注:“先、中、后”的意思是指访问的结点D是先于子树出现还是后于子树出现。,36,例1:,先序遍历的结果是: 中序遍历的结果是: 后序遍历的结果是:,A B D E C D B E A C D E B C A,DLR先序
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号