哈夫曼树基本操作
来源:互联网 发布:韦东山java是开源的吗 编辑:程序博客网 时间:2024/06/05 04:36
结构体定义:
typedef struct node{int data;int l, r, p;}HuffmanTree;1、HufmanTree的建立
void createHuffmanTree(HuffmanTree*& H, int * inArr, int len){int i, j, min1, min2;H = (HuffmanTree*)malloc((2 * len - 1)*sizeof(node));int id1=-1, id2=-1;for (i = 0; i < len; i++)H[i].data = inArr[i];for (i = 0; i < 2 * len - 1; i++)H[i].l = H[i].r = H[i].p = -1;for (i = len; i < 2 * len - 1; i++){min1 = min2 = INT_MAX;for (j = 0; j < i; j++){if (H[j].p == -1) {if (H[j].data < min1){if (id1 == -1){id1 = j;min1 = H[j].data;}else{id2 = id1;id1 = j;min2 = min1;min1 = H[j].data;}}else if (H[j].data < min2){id2 = j;min2 = H[j].data;}}}H[i].l = id1, H[i].r = id2;H[i].data = H[id1].data + H[id2].data;H[id1].p = H[id2].p = i;}}2、求路径长度
int length(HuffmanTree* H, int len){if (len <= 0) return 0;else{int j = 0;int cnt=0;int length = 0;int n = 0;for (int i = len; i >= 0; i--){if (H[i].l == -1 && H[i].r == -1){n = i;while (j!=-1){j = H[n].p;n = j;cnt++;}length += (cnt-1)*H[i].data;cnt = 0;j = 0;}}return length;}}
3、编码
根节点编码为0,以后每一层增加一位,为左子树则为1,右子树则为0,如:根A->左B->左C->右D,则编码A:0,B:00,C:000,D:0001
void HuffmanCode(HuffmanTree* H, int len){if (len <= 0) return;vector<string> rst;string code=" ";int n = 0, j = 0;for (int i = 0; i < len ; i++){if (H[i].l == -1 && H[i].r == -1){cout << H[i].data<<" ";n = i;while (j != -1){j = H[n].p;if (H[j].l == n&&j!=-1){code = code+"0";}if (H[j].r == n&&j != -1){code = code + "1";}n = j;}for (j = code.size(); j >= 0;j--)cout << code[j];cout << endl;code = " ";j = 0;}}}
测试:
int main(){int a[] = { 12,40,15,8,25};HuffmanTree* H = NULL;int len = sizeof(a)/sizeof(a[0]);createHuffmanTree(H, a, len);cout << "the length is: "<<endl;cout << length(H, 2 * len - 1);cout << "\nthe code is: " << endl;HuffmanCode(H, 2 * len - 1);return 0;}
0 0
- 哈夫曼树基本操作
- 基本操作
- 基本操作
- 基本操作
- 基本操作
- 基本操作
- 基本操作
- sparkSQL操作基本操作
- 哈夫曼树的基本构建与操作
- 哈夫曼树的基本构建与操作
- gitlab基本一些基本操作
- Matlab 基本命令、基本操作
- MySQL常用操作基本操作
- C#操作XML(基本操作)
- MySQL常用操作基本操作
- Python -- Json基本操作操作
- MySQL操作数据库基本操作
- MySQL基本操作 结构操作
- 使用Http协议访问网络
- H5新增的块级的语义元素
- Bresenham画线算法
- 构造一个简单的MBR分区表
- Android显示系统_由浅入深_01_屏幕与坐标系统
- 哈夫曼树基本操作
- 《招聘一个靠谱的iOS》面试题参考答案(上)(1-6)
- LeetCode:Path Sum II
- yarn cluster
- solr group
- DX学习笔记(创建DX自带几何体)
- java多线程中子线程与主线程进行轮换
- java.lang.NoClassDefFoundError: com/google/common/base/Charsets
- ios学习路线—C语言(函数,数组,字符串,指针)