• 数据结结构学习 赫夫曼树


    ------ 赫夫曼树和赫夫曼编码的存储表示------

    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)  {
    
    	if (n < 1) return;\
    	int	m = 2* n + 1;
    	HT = (HuffmanTree) malloc (m+1)* sizeof(HTNode); //0 号单元未用
    	for ( HuffmanTree p = HT; i=1; i<=n; ++i; ++p; ++w)  
    		*p = {*w,0,0,0,0};
    	for(; i<=m; ++i; ++p)
    		*p = {0,0,0,0};
    
    	for(i = n+1; i<=m; i++) {  //建立HuffmanTree
    
    		Select(HT,i-1,s1,s2);
    		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++) {
    		int 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)); 
    		strcyp(HC[i],&cd[start]);
    	}
    	free(cd);
    
    }
    

    ------ 无栈非递归遍历赫夫曼树,求赫夫曼编码------

    HC = (HuffmanCode) malloc ( (n+1) * sizeof(char*)); 
    int p = m, cdlen = 0;
    
    for ( int 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].lchild == 0) {
    
                HC[p] = (char*) malloc ((cdlen+1) * sizeof(char));
                cd[cdlen] = "\0"; 
                strcpy(HC[p],cd);
            }
        }else if ( HP[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;
            }
        }    
    }
  • 相关阅读:
    实现可折叠的列表
    ajax知识点补充
    Ajax 完整教程
    从页面左边飞入页面动画效果
    文字闪烁
    点击按钮之后等待60秒
    [SCOI2016]萌萌哒
    [HNOI2011]卡农
    [NOI2015]寿司晚宴
    【bzoj 3489】A simple rmq problem
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/2795617.html
Copyright © 2020-2023  润新知