zoukankan      html  css  js  c++  java
  • 数据结结构学习 赫夫曼树

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

    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;
            }
        }    
    }
  • 相关阅读:
    后缀自动机学习笔记
    [bzoj4516][Sdoi2016]生成魔咒——后缀自动机
    [bzoj1692][Usaco2007 Dec]队列变换——贪心+后缀数组
    BZOJ4811 [Ynoi2017]由乃的OJ
    codeforces796E Exam Cheating
    BZOJ1004 [HNOI2008]Cards
    BZOJ1798 [Ahoi2009]Seq 维护序列seq
    BZOJ4785 [Zjoi2017]树状数组
    UOJ207 共价大爷游长沙
    POJ3768 Katu Puzzle
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/2795617.html
Copyright © 2011-2022 走看看