哈夫曼树基本操作
2016-06-14 18:27
453 查看
结构体定义:
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 .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 .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; }
相关文章推荐
- 构造一个简单的MBR分区表
- 深入理解java虚拟机-目录
- 向json数组添加元素
- 使用Http协议访问网络
- Linux下使用laravel5.2
- GitHub版本控制使用(命令行实际操作图解Git使用方法)
- C 提高2 间接赋值(*p) 是指针存在的最大意义
- linux top命令显示参数详解
- Python里有趣的列表解析和生成器表达式
- Qt之QtSoap(访问WebService)
- Qt之QtSoap(访问WebService)
- 调用防火墙封掉DDOS发起者IP
- RSA 公钥加密——私钥解密
- 向Master注册
- Java实现银行卡号校验
- iOS根据标签不同长度内容按钮自动换行
- resolve.conf总是被自动修改
- Python中的super使用
- dup()系统调用
- POI获取Excel单元格的值,以及处理单元格中是公式的情况