数据结构专题 | 哈夫曼树

发布于:2022-11-13 ⋅ 阅读:(668) ⋅ 点赞:(0)

目录

哈夫曼树的结构

哈夫曼树的口诀

哈夫曼树的建立  


 

哈夫曼树的结构

typedef struct{
    char data;          //哈夫曼树存储的字符
    int weight;          //权值
    int parent;          //结点的双亲
    int lchild;            //结点的左孩子
    int rchild;            //结点的右孩子
}HNodeType; 

哈夫曼树的口诀

建立哈夫曼树的方法:

(1)构造森林全是根

(2)合并两小建新树

(3)删除两小添新树

(4)重复(2)(3)剩单根

哈夫曼树的建立  

void HuffmanTree(HNodeType HuffNode[],int n){
    int i,j,x1,x2,m1,m2;          //i,j用于循环;x1,x2用于保存两个权值最小结点的下标;m1,m2用于保存两个权值最小的权值 
    for(i=0;i<2*n-1;i++){         //初始化置所有结点的双亲,左右孩子的下标为-1 
        HuffNode[i].parent=-1;
        HuffNode[i].lchild=-1;
        HuffNode[i].rchild=-1;
    }
    for(i=0;i<n-1;i++){         //由于前面n个结点的权值已经知道,我们只需要循环得到后面n-1个权值即可,一共循环n-1次 
        m1=m2=100;              //初始化置m1,m2都为最大 
        x1=x2=0;                //初始化置x1,x2都为下标0 
        for(j=0;j<n+i;j++){     //在n+i个里面找最小的两个(n个是原有的,i个是每次新加入的树) 
            if(HuffNode[j].weight<m1&&HuffNode[j].parent==-1){   //寻找两个最小的值(当有权值小于最小值时,执行) 
                m2=m1;          //m2保存次小的权值 
                x2=x1;          //x2保存次小权值的下标 
                m1=HuffNode[j].weight;     //m1保存最小的权值 
                x1=j;                      //x1保存最小权值的下标 
            }else if(HuffNode[j].weight<m2&&HuffNode[j].parent==-1){     //当权值都大于最小值,我们找它是否小于次小值 
                m2=HuffNode[j].weight;     //小于次小值就把它给m2 
                x2=j;                      //下标保存次小值 
            }
        }
        HuffNode[x1].parent=n+i;    //最小值和次小值的双亲下标是n+i 
        HuffNode[x2].parent=n+i;    
        HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight;   //第n+i个元素是x1,x2的双亲,它的权值等于两者相加 
        HuffNode[n+i].lchild=x1;            //第n+i个元素的左孩子为x1,右孩子为x2 
        HuffNode[n+i].rchild=x2;
        HuffNode[n+i].data='0';     //将双亲的字符赋为'0' 
    }
    for(i=0;i<2*n-1;i++){
        printf("%c %d %d %d %d\n",HuffNode[i].data,HuffNode[i].weight,HuffNode[i].parent,HuffNode[i].lchild,HuffNode[i].rchild);
    }