贪心算法-哈夫曼树-(树的建立,带权路径长度,哈夫曼编码)

本文介绍了哈夫曼树的基本概念,包括路径、路径长度和节点带权路径长度。详细阐述了如何通过贪心算法建立哈夫曼树,并提供了相应的代码实现。此外,还讲解了哈夫曼树的带权路径长度计算方法及哈夫曼编码的生成过程。
摘要由CSDN通过智能技术生成
哈夫曼树中的名词意思:(ps:本想画个图的不知这上面怎么弄,就没弄了)

树的权值:每个树节点所在的那个数字。

路径:两个节点之间所经过的分支。

路径长度: 某一路径上的分支条数。

节点带权路径长度: 节点的权值*该节点的路径长度。

树带权路径长度:所有叶子节点的带全路径长度之和。

树带权路径长度:所有叶子节点的带全路径长度之和。

建立哈夫曼树:单独将数组中的每个值作为一个节点,依次选出剩余节点的最小与次小,并将其合为树结构的一部分。代码为:

 
btreenode *CreateHuffman(int a[],int n)
{
    int i;
    btreenode *s[n+1], *ss;
    for(int i = 0;i<n;i++){
        s[i] = new btreenode;  //初始化s指针数组,使每个指针元素指向a数组中对应的元素结点
        s[i]->data = a[i];   //将树拆成森林,每棵树都只有一个根节点
        s[i]->left = s[i]->right = NULL;
    }
    for(int i  = 1;i<n;i++){        //进行 n-1次循环建立哈夫曼树
           int k = -1,t;           //k表示森林中具有最小权值的树根结点的下标,t为次最小的下标
        for(int j = 0;j<n;j++){   //k初始指向森林中第一棵树,t指向第二棵
                if(s[j]&&k==-1){
                   k = j;
                   continue;
                }
                if(s[j]){
                    t =  j;
                    break;
                }
        }
        for(int i = t;i<n;i++){   //从当前森林中求出最小权值树和次最小 ;
            if(s[i]){
                if(s[i]->data<s[k]->data){        //比最小树小
                    t = k;
                    k = i;
                }
                else if(s[i]->data<s[t]->data){  //比次小树小
                    
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值