数据结构ch6树与二叉树.ppt

  1. 1、本文档共93页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构ch6树与二叉树

6.2.2 二叉树的性质 (3+2) 6.3.2 线索二叉树 为识别复用的两种不同信息,特增加两个标志域: 1. 有关线索二叉树的几个术语: 例:带了两个标志的某先序遍历结果如下表所示,请画出对应的二叉树。 例1:画出以下二叉树对应的中序线索二叉树。 例2:【 2000年计算机系考研题】给定如图所示二叉树T,请画出与其对应的中序线索二叉树。 线索二叉树的生成算法(递归算法见教材P134-135) 3. 线索二叉树的遍历(无需堆栈) 附:中序线索二叉树遍历步骤 (算法6.5): 算法流程: 10 7 17 0 0 0 — 0 0 0 — 0 0 0 — 0 0 0 — 0 0 0 —- 0 0 0 0 0 0 0 0 r 0 0 10 0 0 21 0 0 3 0 0 32 0 0 6 0 0 2 0 0 19 0 0 7 l p w 13 12 10 11 9 8 7 6 5 4 3 2 1 w={ 7, 19, 2, 6, 32, 3, 21, 10 }在机内存储形式为: 2 3 5 28 21 19 40 100 b c a 11 6 d 60 32 e g f h 请注意:哈夫曼树样式不惟一,编程时应该有约定,“先来先挂接” √ √ 5 9 9 √ √ 11 10 10 4 9 17 28 √ √ √ √ √ √ 40 √ √ 60 100 双亲 左右孩子 3 6 * 1 8 11 11 10 11 12 12 选择parent为0且weight最小的两个结点 根据哈夫曼树得到对应编码: 符 编码 频率 a 0.07 b 0.19 c 0.02 d 0.06 e 0.32 f 0.03 g 0.21 h 0.10 符 编码 频率 a 0.07 b 0.19 c 0.02 d 0.06 e 0.32 f 0.03 g 0.21 h 0.10 1110 00 11010 1100 10 11011 01 1111 000 001 010 011 100 101 110 111 Huffman码的WPL=2(0.19+0.32+0.21) + 4(0.07+0.06+0.10) +5(0.02+0.03) =1.44+0.92+0.25=2.61 3(0.19+0.32+0.21+0.07+0.06+0.10+0.02+0.03)=3 二进制等长码的WPL= 按左0右1标注 0 0 0 0 0 0 1 1 1 1 1 1 1 0 10 7 17 2 3 5 28 21 19 40 100 b c a 11 6 d 60 32 e g f h * typedef struct{ unsigned int weight;//权值分量(可放大取整) unsigned int parent,lchild,rchild; //双亲和孩子分量 }HTNode,*HuffmanTree;//用动态数组存储Huffman树 Huffman树的存储表示: 0 0 0 r 0 9 2 0 0 19 0 0 7 l p w 3 2 1 双亲 *HuffmanTree或 HT向量样式: HT[3].parent=9 …… * 注: 常先用一个int型数组来采集权值W,并用*w指针拷贝给HT Huffman树HT的机内实现: 先构造Huffman树HT, 才能求出N个字符的Huffman编码HC。 Void HuffmanCoding(HuffmanTree HT, HuffmanCode HC, int *w, int n){ if (n=1)return; m=2*n-1; //n 个叶子的HuffmanTree共有2n-1个结点; HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //0单元未用 for(p=HT+1,i=1; i=n; ++i,++p,++w)*p={*w,0,0,0}; //给前n个单元初始化(教材有误) for(;i=m; ++i,++p)*p ={0,0,0,0}; //从叶子之后的存储单元清零 for(i=n+1;i=m; ++i){ //建Huffman树(从n个叶子后开始存内结点) Select(HT, i-1, s1, s2); //在HT[1…i-1]选择parent为0且weight最小的两个结点,其序号分别为s1和s2(教材未列此函数源码) HT[s1].parent=i; HT[s2].parent=i; //给双亲分量赋值 HT[i].lchild=s1; HT[i].rchild=s2; //给合并后的内结点赋孩子值 HT[i].weight=HT[s1].we

文档评论(0)

quechui388620 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档