哈夫曼树基本操作

来源:互联网 发布:韦东山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