哈夫曼树(最优二叉树:带权路径长度最短的树(度相同的情况下))

基本概念

1、结点的路径长度:两结点间间路径上的分支数

2、树的路径长度:从根结点到每一个结点的路径长度之和

3、结点的带权路径长度:从根结点到该结点之间的路径长度与该结点的权的乘积

4、树的带权路径长度:树中所有叶子结点的带权路径长度之和

构造哈夫曼树(贪心算法)

权值越大的叶子离根越近

具有相同带权节点的哈夫曼树是不唯一的

构造森林全是根(每个每个带权值结点都做根,造成结点个数的森林)

选用两小造新树(选出两个权值小的树作为左右子树构造一个新的树)

删除两小填新人(新树的权值是“两小”权值相加)

重复2、3剩单根(重复2.3步骤,直到剩下一个根)

哈夫曼树的结点的度数为0或2,没有度为1的结点

包含n棵树的森林要经过n-1次合并才能形成哈夫曼树,共产生n-1个度为二的新结点,故总结点为2n-1;

算法实现

(顺序存储结构---一维数组)

//结点类型定义
typedef struct{
    int weight;      //权值
    int parent,lch,rch;
}HTNode,*HuffmanTree;


void CreatHuffmanTree(HuffmanTree HT,int n){
    if(n<=1) return ;
    m=2*n-1;           //生成树共有m个结点
    HT=new HTNode[m+1];  //0号元素不使用
    for(int i=1;i<=m;++i){
        HT[i].lch=0;HT[i].rch=0;HT.[i].parent=0;
    }
    for(int i=1;i<=n;++i){
        scanf("%d",&HT[i].weight);  
    }
    for(i=n+1;i<=m;i++){
        select(HT,i-1,s1,s2);//在HT[k](1<=k<=i-1)中找出最小的两个双亲为零且权值最小的结点返回他们在HT中的序号s1,s2
        HT[s1].parent=i;HT[s2].parent=i; //表示从表中删除是s1,s2
        HT[i].ch=s1;HT[i].rch=s2;        //s1,s2分别作为i的左右孩子 
        HT[i].weight=HT[s1].weight+HT[s2].weight;   //i的权值为左右孩子之和
    }
}

应用(哈夫曼编码)

、算法实现

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nuo__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值