【数据结构】BOJ-3.2哈夫曼树的编码与译码(C语言)
感谢冬日之心提供题目截图
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 8
typedef struct HaffTNode
{
int weight;
struct HaffTNode *parent,*right,*left;
}HaffTNode,*HaffTree;
HaffTree CreatHaffTNode(int weight) //生成结点, 初始化指针为NULL
{
HaffTNode* NewNode;
NewNode = (HaffTNode*)malloc(sizeof(HaffTNode));
NewNode->weight = weight;
NewNode->parent = NULL;
NewNode->left = NULL;
NewNode->right = NULL;
return NewNode;
}
HaffTree FindTwoMin(HaffTree *Node)//在结点数组中找最小结点并连接成树 返回根结点
{
HaffTree temp;
HaffTree T = CreatHaffTNode(0);
HaffTree L = CreatHaffTNode(99);
HaffTree R = CreatHaffTNode(99);
int i = 0;
while(Node[i] != 0)
{
if(Node[i]->parent == NULL)
{
temp = Node[i];
if (temp->weight < R->weight)
{
if (temp->weight > L->weight)
R = temp;
else{
R = L;
L = temp;
}
}
}
i++;
}
T->left = L;
T->right = R;
T->parent = NULL;
T->weight = (L->weight) + (R->weight);
L->parent = T;R->parent = T;
return T;
}
int main() {
char word[LEN] = {'a','b','c','d','e','f','g','h'};
int weight [LEN] = {7,19,2,6,32,3,21,10};
HaffTree Node[20];
memset(Node,0,sizeof(HaffTNode*)*20);
int arrlen = LEN;
for(int i = 0; i < LEN;i++)//生成点
Node[i] = CreatHaffTNode(weight[i]);
HaffTree T = NULL;
T = CreatHaffTNode(0);
for(int num = LEN; num > 1; num--)
{
T =FindTwoMin(Node);
Node[arrlen] = T; arrlen++;
}
char str[100] = {'\0'};
scanf("%s",str);
int lenth = strlen(str);
HaffTNode *ptr = T;
for(int k = 0;k<lenth+1;)
{
if (ptr->left == NULL || ptr->right == NULL)
{
for (int j = 0; j < LEN; ++j)
{
if (weight[j] == ptr->weight)
printf("%c", word[j]);
}
ptr = T;
} else {
if (str[k] == '0')
ptr = ptr->left;
else
ptr = ptr->right;
k++;
}
}
return 0;
}