您的位置:首页 > 其它

哈夫曼树基本操作

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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: