网站大量收购独家精品文档,联系QQ:2885784924

第6章 树与二叉树3数据结构.ppt

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

第六章 树和二叉树 本讲主要内容: 树和森林 哈夫曼树及其应用 6.4 树和森林 6.4.1 树的存储结构: 双亲表示法:除根结点外的每个结点都只有唯一的双亲 树的双亲表存储表示 #define MAX_TREE_SIZE 100; Typedef struct PTNode{ TElemType data; int patent; }//PTNode; Typedef struct{ PTNode nodes[MAX_TREE_SIZE]; int r,n; }//PTree; 优点:parent(T,x),Root(x)操作容易实现 确定:求结点的孩子时需要遍历整个结构 孩子表示法: 树的孩子链表存储表示 Typedef struct CTNode{ //孩子结点 int child; struct CTNode *next; }*childptr; Typedef struct{ TElemType data; childptr firstchild; //孩子链表头指针 }CTBox; Typedef struct{ CTBox nodes[MAX_TREE_SIZE]; int n,r; //结点数和根的位置; }//CTree; 孩子兄弟表示法:以二叉链表表示 每个结点有两个链域:firstchild和nextsibling:第一个孩子结点和下一个兄弟结点 6.4.2 森林与二叉树的转换 森林与二叉树的对应关系 森林/树与二叉树之间的相互转换 森林转换成二叉树: 若F={T1,T2,···Tm}是森林,则按如下规则转换成一棵二叉树B=(root,LB,RB): (1)若F为空,则m=0,B为空; (2)若F非空,则B的根root是森林中的第一颗树的根ROOT(T1);B的左子树LB是从T1中根结点的子树森林F1={T11,T12,···,T1m1}转换而成的二叉树;B的右子树RB是从森林F’={T2,T3,···,Tm}转换而成的二叉树 二叉树转换成森林: 6.4.3 树和森林的遍历 树的遍历: 先根遍历 后根遍历 森林的遍历: 先序遍历森林 中序遍历森林: (1)中序遍历森林中的第一颗树的根结点的子树森林; (2)访问第一颗树的根结点; (3)中序遍历剩余的树构成的森林。 画出和下列已知序列对应的树T: 树的先根次序访问序列为:G F K D A I E B C H J 树的后根次序访问序列为:D I A E K F C J H B G 6.6 哈夫曼树及其应用 哈夫曼树:最优树,带权路径长度最短的树。 6.6.1 最优二叉树(哈夫曼树) 路径:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径; 路径长度:路径上的分支数目; 树的路径长度:从树根到每一个结点的路径长度之和 树的带权路径长度:树中所有叶子结点的带权路径长度之和 其中:wk为k个结点的权值 最优二叉树(哈夫曼树):带权路径长度WPL最小的二叉树 如何构造哈夫曼树 然后,看构造哈夫曼树的过程 编码问题: 等长的二进制编码: 如:字符A/B/C/D编码:00 01 10 11 则:在翻译电文时2位一组即可 不等长的二进制编码: 如:字符A/B/C/D编码:0 00 1 01 则:如果收到电文:0000,得到译文就不是唯一的 结论:若要设计长度不等的编码,则必须是任一字符的编码都不是另一个编码的前缀——前缀编码 哈夫曼树与哈夫曼编码的存储表示 Typedef struct{ unsigned int weight; unsigned int parent,lchild,rchild; }HTNode,*HuffmanTree;//动态分配数组存储哈夫曼树 Typedef char *HuffmanCode;//动态分配哈夫曼编码表 构造哈夫曼树,求哈夫曼编码的算法 void HuffmanCoding(HuffmanTree HT,HuffmanCode HC,int *w,int n){ //w存放n个字符的权值,构造哈夫曼树HT,求n个字符的哈夫曼编码表 if (n=1) return; m=2*n-1; //n个字符的哈夫曼树有(2*n-1)个结点 HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); for (p=HT,i=1;i=n;++i,++p,++w) *p={*w,0,0,0}; for (;i=m;++i,++p) *p={0,0,0,0}; for (i=n+1;i=m;++i){ //构造哈夫曼树 select (HT,i-1,

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档