静态链表实现:

#include<iostream>
#include<vector>
#include<string>
using namespace std;const int maxWeight = 32767;struct HTNode
{char data;int weight;int parent,lchild,rchild;
};
struct HFTree
{vector<HTNode>elem;int root;int num;   // huffman树外结点个数
};
void createHFTree(HFTree &HT,string value,vector<int>fr)
{//输入数据value[n]和 相应权值fr[n],构造用三叉链表表示的Huffman树HT int min1,min2;HT.elem.resize(value.length()*2-1);           //huffman是一颗正则二叉树,有2*n-1个结点 for(int i = 0; i < value.length(); i++)    {HT.elem[i].data = value[i];HT.elem[i].weight = fr[i]; }for(int i = 0; i < 2*value.length()-1; i++)      {HT.elem[i].parent = HT.elem[i].lchild = HT.elem[i].rchild = -1; }int s1,s2;for(int i = value.length(); i < 2*value.length() - 1 ; i++)           //循环n-1次,因为还有    {                                                                  //n-1个结点要添加 min1 = min2 = maxWeight;s1 = s2 = 0;for(int k = 0;k < i; k++){if(HT.elem[k].parent == -1){if(HT.elem[k].weight < min1 )      //最小 {min2 = min1;s2 = s1;min1 = HT.elem[k].weight;s1 = k;}else if(HT.elem[k].weight < min2) //次小 {min2 = HT.elem[k].weight;s2 = k;}}}HT.elem[s1].parent = HT.elem[s2].parent = i;       HT.elem[i].lchild = s1;   HT.elem[i].rchild = s2;HT.elem[i].weight = HT.elem[s1].weight + HT.elem[s2].weight; }HT.num = value.length();   HT.root = 2*value.length() - 2;
} int main()
{string values = "ABCDE";vector<int> fr = {7,5,2,4,6};HFTree HF;createHFTree(HF,values,fr); for(int i = 0; i < HF.elem.size(); i++){cout<<HF.elem[i].data<<" parent is "<<HF.elem[i].parent<<" lchild is "<<HF.elem[i].lchild<<" rchild is "<<HF.elem[i].rchild<<" weight is "<<HF.elem[i].weight<<endl; } return 0;
}

二叉链表实现:

#include<iostream>
#include<vector>
#include<string>
#include<queue>using namespace std;struct Node
{char data;double weight;Node *lchild,*rchild;Node(char _data,double _weight){data = _data;weight = _weight;lchild = rchild = NULL;}
};class cmp
{public:bool operator()(const Node *n1,const Node *n2) const{return n1->weight > n2->weight;}
};void createHuffmanTree(Node *&root,string values,vector<double>weights)
{if(values.length() <= 0) {root = NULL;return ;} priority_queue<Node*,vector<Node*>,cmp> q;        //优先队列for(int i = 0; i < values.length(); i++){Node *newNode = new Node(values[i],weights[i]);q.push(newNode); }for(int i = 0; i < values.length() - 1; i++)    //循环n-1次,加n-1个结点 {//因为huffman树是正则二叉树(只有度为2和0的结点),所以共2n-个结点,所以再加n-1个结点就够了 Node *x = q.top();q.pop();Node *y = q.top();q.pop();Node* cur = new Node('#',x->weight + y->weight);cur->lchild = x;cur->rchild = y;   q.push(cur); }root = q.top();
}
void printHuffmanCode(const Node *root,string code)
{if(root->lchild == NULL && root->rchild == NULL){cout<<root->data<<": huffman code is "<<code<<endl;}else{printHuffmanCode(root->lchild,code+"0");printHuffmanCode(root->rchild,code+"1");}
}
void printHuffmanTree(Node *root,int k)     //这里是先打印水平打印,先打印的右子树再打左子树
{if(root != NULL){printHuffmanTree(root->rchild,k+5);for(int i = 0; i < k; i++){cout<<" ";}cout<<root->data<<endl;printHuffmanTree(root->lchild,k+5);}
}
int main()
{string values = "abcde";vector<double>weights = {0.05,0.20,0.35,0.30,0.10}; Node *root = NULL;createHuffmanTree(root,values,weights);printHuffmanCode(root,"");printHuffmanTree(root,0); return 0;
}


(注:huffman编码树的形态不一定是一样的,因为同一层左右子女位置可以交换,这里实现的weight小的在左边,大的在右边。

===========================================================

严版huffman:


typedef struct {int weight;int parent,lchild,rchild;
}HTNode, *HuffmanCode;typedef char **HuffmanCode;void HuffmanCoding(HuffmanTree &HT,int *w,int n)
{if(n <= -1) return ;int m = 2*n-1;HT = (HuffmanCode)malloc((m+1)*sizeof(HTNode));int i;for(HTNode *p=HT, i = 1; i <= n; i++, p++, w++){*p = {*w, 0, 0, 0};}for( ;i <= m; i++) { *p = {0,0,0,0};}for(i = n+1;i <= m; i++){select(HT, i-1,s1,s2); //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;}
}
void getHuffmanCode(HuffmanTree &HT, HuffmanCode&HC)
{HC = (HuffmanCode)malloc((n+1)*sizeof(char*));cd = (char*)malloc(n*sizeof(char));cd[n-1] = "\0";for(int i = 1; i <= n; i++){int start = n-1;for(int 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));strcpy(HC[i], &cd[start]);} free(cd);
}

huffman树--静态链表和链表实现(借助优先队列)相关推荐

  1. 树的存储结构(树的二叉链表(孩子—兄弟))

    // c6-5.h 树的二叉链表(孩子-兄弟)存储结构(见图6.32) typedef struct CSNode {TElemType data;CSNode *firstchild,*nextsi ...

  2. inner join 链表_链表树——复合数据结构应用实例

    我们清楚:数据库设计中,表结构设计的好坏,直接影响程序的复杂度.所以,本文就无限级分类(目录)树与链表的复合在表设计中的应用进行探讨.当然,什么是树,什么是链表,这里不作介绍.有兴趣可以去看相关的教材 ...

  3. 创建孩子兄弟链表的树c语言,树的孩子兄弟链表实现

    树的孩子兄弟链表存储结构,采用两条链分别连接孩子和兄弟结点.其中,child指向该结点的第一个孩子结点,sibling指向该结点的下一个兄弟结点. public class Tree { privat ...

  4. [C语言] 通讯录|静态 动态 文件 链表 多版本讲解

    学校的期末小作业,相当于对我们本学期所学内容的一个总结.只要对标题所指内容有所了解即可轻松读懂本题解.下面我们按照要求一步步由浅入深地解决这个问题. 目录 ​ 静态版本 定义类型 添加 输出 查找 修 ...

  5. Huffman编码(Huffman树)

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "Huffman编码(Huffman树)" 的idea 并用源代码加以实现: 0.2) ...

  6. Huffman树压缩和解压文件

    Huffman树 Huffman树:以静态三叉链的存储结构建立的二叉树 Huffman树是一个带权路径长度最小的二叉树,又称最优二叉树 Huffman树的构造方法 ①将每个结点都看作是一个树: ②选择 ...

  7. python构建huffman树_python:哈夫曼树,PythonHuffuman

    Python:Huffuman树 题目 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列 ...

  8. c++ 链表_链表(单向链表的建立、删除、插入、打印)

    线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构 非线性结构:不满足线性结构的数据结构 链表(单向链表的建立.删除.插入.打印) 1.链表一般分为: 单向链表 双 ...

  9. LeetCode-21.合并两个有序链表(链表+递归)

    题目内容 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/ 将两个升序链表合并为一个新的 升序 链 ...

最新文章

  1. CodeForce 534C Polycarpus' Dice (数学推理)
  2. 脚本启动Tomcat
  3. linux启动过程中内核拷贝,轻松识破linux内核启动过程中的“”套路“”
  4. 使用acme.sh签发Let's Encrypt的免费数字证书
  5. hive币涨幅空间大吗_自动消防水炮只能安装在大空间场所吗
  6. RxHttp 一条链发送请求之强大的Param类(三)
  7. 洛谷——P1897 电梯里的爱情(两种解法:普通方法、桶排序方法)
  8. Spring Boot + PageHelper 实现分页,总结得很全了!
  9. fastboot刷系统的步骤
  10. 智慧城市综合管控平台
  11. android 坡度计算器,坡度角度换算(角度和坡比对照表)
  12. Java Session对象的钝化和活化
  13. 解开硬盘逻辑死锁的一种有效方法 (转)
  14. 哈希表与哈希(Hash)算法
  15. Day 。 9 我来个初级的文字游戏《魔兽世界。巫妖王之怒》
  16. SSM+阳光大学宿舍管理系统 毕业设计-附源码211714
  17. vlc在Ubuntu下的自动安装和手动安装
  18. 已拿 Offer!字节跳动面试经验分享
  19. 富士胶片LTO磁带减排效益获认可;耀世星辉深度测试海外版语音社交产品“悦聊”CheerChat | 全球TMT...
  20. MVC 自定义 错误页面

热门文章

  1. arcgis python 教程-按区域消除--arcgis python实例教程
  2. python界面-图形界面
  3. micropython和python区别-MicroPython入坑记(三)板子上的Python到底有多快?
  4. python用什么编译器-python应选什么编译工具
  5. python可以做什么工作-Python可以做什么工作?Python有哪些方向?
  6. lsdyna如何设置set中的node_list_详解MySQL数据库如何实现类似Oracle的序列?
  7. cover 在html中的作用,Cover
  8. Web API-随机性案例步骤
  9. vue内容省略表示(超过15位显示...)
  10. 【王道计组笔记】储存系统(2):主存简单模型及寻址的概念