- 1、本文档共41页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五树2
第五章 树 线索二叉树的定义 线索:指向前驱或后继结点的指针称为线索 线索二叉树:加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树 定义 将二叉树变为线索二叉树的过程为线索化 算法 二叉树中根序线索化 时间复杂度为:O(n) 查找某结点*p在指定次序下的前驱和后继结点 中序后继分两种情形 *p的右子树空 即p-rtag为Thread *p的右子树非空 即p-rtag为Link 算法 时间复杂度 该算法的时间复杂度不超过树的高度h,即O(h) 查找指定结点*p的后序前驱结点 若*p的左子树为空 若*p的左子树为非空 查找指定结点*p的后序后继结点 若*p是根 若*p是其双亲的右孩子 若*p是其双亲的左孩子,但*p无右兄弟 若*p是其双亲的左孩子,但*p右右兄弟 遍历中序线索二叉树 算法: 时间复杂性为:O(n) 实现 定义结构数组存放树的结点,每个结点含两个域 数据域:存放结点本身信息 双亲域:指示本结点的双亲结点在数组中位置 特点 找双亲容易,找孩子难 #define MAXNODE //最大结点数 typedef struct { datatype data; //数据域 int parent; //双亲域(静态指针域) }tnode; typedef tnode tree[MAXNODE+1];//静态双亲链表 实现 每个结点的孩子结点(多个)用单链表存储,再用含n个元素的数组指向每个孩子链表 特点 找孩子容易,找双亲难 实现 用二叉链表作树的存储结构,链表中每个结点的两个指针域分别指向其第一个孩子结点和下一个兄弟结点 特点 操作容易,破坏了树的层次 类型定义 typedef struct tnodetp { numtype data; tnodetp *fch,*nsib; } * tlinktp; 森林转换成二叉树 将各棵树分别转换成二叉树 将每棵树的根结点用线相连 以第一棵树根结点为二叉树的根,再以根结点为轴心,顺时针旋转,构成二叉树型结构 先根序遍历 A,B,D,E,H,I,J,C,F,G 后根序遍历 D,H,I,J,E,B,F,G,C,A 层次遍历 A,B,C,D,E,F,G,H,I,J 哈夫曼树及其应用 路径 从树中一个结点到另一个结点之间的分支构成这两个结点间的路径 树的路径长度 从树根到每一个结点的路径长度之和 树的带权路径长度 树中所有带权结点的路径长度之和,通常记作 WPL=W1*L1 +W2*L2 +W3*L3 +...+Wn*Ln= 根据给定的n个权值:w1 ,w2 ,...,wn 构成n棵二叉树的集合F=T1 ,T2 ,...,Tn ,其中每棵二叉树Ti 中只有一个带权为wi 的根结点,其左、右子树均为空。 在F中任选两棵根结点的权值最小的树作为左、子树构成一棵新的二叉树且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。 在F中删除这两棵树,同时将新得到的二叉树加入到F中。 重复做⑵和⑶直到F只含一棵树为止。这棵树便是哈夫曼树。 #define n //叶子数 #define m 2*n-1//树中结点总数 typedef struct //结点类型 { int weight;//权值 int plink,llink,rlink; //双亲及左右孩子指针 }node; node tree[m+1]; //下标取值从1到m,0作为空指针标志 注意 一棵有n个叶子结点的Huffman树有2n-1个结点 初始化 将tree[1..m]中每个结点里的三个指针均置为空(即置为0) 输入 读入n个叶子的权值存于向量的前n个分量中,它们是初始森林中n个孤立的根结点上的权值 合并 对森林中的树共进行n-1次合并,所产生的新结点依次放入向量tree的第i个分量中ni≤m 思想 根据字符出现频率编码,使电文总长最短 编码 根据字符出现频率构造Huffman树,然后将树中结点引向其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码即为从根到每个叶子的路径上得到的0、1序列(如图5.27) 算法 二叉树的定义、性质和存储结构 二叉树的遍历和线索化 树的定义和存储结构 树、森林与二叉树转换 树和森林的遍历以及树的应用 学习要点 熟悉树和二叉树的递归定义,有关的术语及基本概念; 熟练掌握二叉树的性质,了解相应的证明方法; 熟练掌握二叉树的两种存储方法,特点及适用范围; 遍历二叉树是二叉树的各种运算的基础,因此,不仅要熟练掌握各种次序的遍历算法,而且还要能灵活运用遍历算法实现二叉树的其它各种运算; 了解二叉树线索化及其实质,是建立结点及其在相应
文档评论(0)