b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

哈夫曼树的构造_哈夫曼树路径长度_哈夫曼树的权

电脑杂谈  发布时间:2017-02-21 02:25:01  来源:网络整理

哈夫曼树路径长度_哈夫曼树的权_哈夫曼树的构造

例5: 编写按层次(同一层从左至右)遍历二叉树的算 法。 void LayerOrder(Bitree T)//层序遍历二叉树 { ??InitQueue(Q); ?? EnQueue(Q,T); ??while(!QueueEmpty(Q)) { ????DeQueue(Q,p); ?visit(p); ????if(p->lchild) EnQueue(Q,p->lchild); ?if(p->rchild) EnQueue(Q,p->rchild); ?} } 作业: 6.26 * 第6章 树和二叉树 6.6 哈夫曼树及其应用 1. 哈夫曼树 ①路径长度 从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径, 路径上的分支数目称做路径长度。 ②树的路径长度 从树根到每一结点的路径长度之和。 ③结点的权和带权路径长度 给树的每个结点赋予一个具有某种实际意义的实数,我们称该实数为这个结点的权。哈夫曼树路径长度在树形结构中,我们把从树根到某一结点的路径长度与该结点的权的乘积,叫做该结点的带权路径长度。 ④树的带权路径长度WPL (Weighted Path Length of Tree) 树中所有叶子结点的带权路径长度之和,通常记为: WPL(a)=7×2+5×2+2×2+4×2=36 WPL(b)=4×2+7×3+5×3+2×1=46 WPL(c)=7×1+5×2+2×3+4×3=35 ⑤哈夫曼树(最优二叉树) 设二叉树具有n个带权值的叶子结点,那么从根结点到各个叶子结点的路径长度与相应结点权值的乘积的和,叫做二叉树的带权路径长度。

具有最小带权路径长度的二叉树称为哈夫曼树。 < 60 bad 0~59 <70 pass 60~69 <80 general 70~79 <90 good 80~89 excellent 90~100 <80 <70 <90 < 60 general 70~79 bad 0~59 pass 60~69 good 80~89 excellent 90~100 2.构造哈夫曼树(哈夫曼算法) 由给定的n个权值{W1,W2,...,Wn},构造n棵只有一个叶子结点的二叉树,从而得到一个二叉树的集合F={T1,T2,...,Tn}; 在F中选取根结点的权值最小和次小的两棵二叉树作为左、右子树构造一棵新的二叉树,这棵新的二叉树根结点的权值为其左、右子树根结点权值之和; 在集合F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到集合F中; 重复(2)、(3)两步,当F中只剩下一棵二叉树时,这棵二叉树便是所要建立的哈夫曼树。 给定权值w=(1,3,5,7)来构造一棵哈夫曼树 。 3. 哈夫曼编码 前缀编码 任一字符的编码都不是另一个字符的编码的前缀。

哈夫曼树的构造_哈夫曼树路径长度_哈夫曼树的权

哈夫曼编码(最优前缀编码) 由哈夫曼树求得的前缀编码。 1 3 5 7 对应的哈夫曼编码如下: a:000 b:001 c:01 d:1 4. 哈夫曼编码算法的实现 typedef struct  { unsigned int weight ; // 结点的权值 unsigned int parent, lchild, rchild ;  }HTNode, * HuffmanTree; //动态分配数组存储哈夫曼树 typedef char * *HuffmanCode ; //动态分配数组存储哈夫曼编码 哈夫曼树中没有度为1的结点(严格的或正则的二叉树)。 n个叶子结点,共有2n-1个结点。 7 6 5 4 4 2 3 5 2 7 1 R L P w 6 3 4 5 5 11 2 5 6 6 18 1 6 7 7 0 0 0 0 0 0 0 0 0 void HuffmanCoding( HuffmanTree &HT , HuffmanCode &HC, int *w, int n) { m=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 = {0, 0, 0, 0}; for(i=n+1; i<=m; i++){ select(HT, i-1, s1, s2); //在HT[1..i-1], HT[s1].parent=i; HT[s2].parent=i;  HT[i].lchild=s1; HT[i].rchild=s2;  HT[i].weight=HT[s1].weight+HT[s2].weight; } } HC=(HuffmanCode)malloc((n+1)*sizeof(char *)); cd=(char * )malloc(n * sizeof(char )); cd[n-1]= ‘\0’ ; for(i=1; i<=n; i++) { start=n-1; for(c=i, f=HT[i].parent; f! =0; c=f, f=HT[f].parent) if(HT[f].lchild==c) cd[--start]=‘0’; else cd[--start] =‘1’; HC[i] = (char *)malloc((n-start)*sizeof(char)); strcpy(HC[i], &cd[start]); } free(cd); HC=malloc(…); cd = malloc(…); p = m; cdlen = 0; for(i=1;i<=m;++i) HT[i].weight = 0; while(p) { if(HT[p].weight == 0){//向左 HT[p].weight = 1; if(HT[p].lchild != 0){p = HT[p].lchild; cd[cdlen++]=‘0’;} else if(HT[p].rchild == 0){ HC[p] = (char *)malloc((cdlen+1)*sizeof(char)); cd[cdlen]=‘\0’; strcpy(HC[p], cd); } }else if(HT[p].weight == 1){//向右 HT[p].weight = 2; if(HT[p].rchild!=0) {p=HT[p].rchild; cd[cdlen++] = ‘1’; }else{ HT[p].weight=0; p=HT[p].parent; --cdlen; } } 例1: 假设二叉树采用二叉链存储结构存储,试设计一个算法,输出一棵给定二叉树的所有叶子结点。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33590-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...