c语言哈夫曼树构造代码
博主就很掘的一个人,最近学哈夫曼树,想着用指针去实现,觉得用指针实现,内存消耗会更少,写到后面发现越来与麻烦,且内存开销并没有减少,于是还是使用结构体数组中规中矩的去实现哈夫曼树,博主不爱看别人的代码,知道原理便直接上手实现,所以,我的代码往往更加简单,因为,自己写,越简单越好,谁愿意写复杂的代码呢,学习哈夫曼树得小伙伴可以学习学习下面的代码。
#include<stdio.h>
#include<stdlib.h>
typedef struct Tree {
int data = -1;
int parent = -1;
int lchild = -1;
int rchild = -1;
}Tree;
void InitHuffmanTree(Tree HT[],int a[],int n) {
int i;
for (i = 0; i < n; i++) {
HT[i].data= a[i];
// HT[i].rchild = NULL;
//HT[i].lchild = NULL;
}
}
void HuffmanTree_print(Tree HT[], int n ) {
int i;
for (i = 0; i < n; i++) {
printf("%d ", HT[i].data);
// printf("%d ", HT[i].parent);
}
}
void select(Tree HT[],int n) {
int min1, min2, min1_index, min2_index;
int ju1=0 ,ju2=0;
for (int i = 0; i < n; i++) {
if (HT[i].parent == -1 && ju1==0) {
min1 = HT[i].data;
min1_index = i;
ju1 = 1;
}
if (HT[i].parent == -1 && ju1 != 0&& min1> HT[i].data) {
min1 = HT[i].data;
min1_index = i;
}
}
HT[min1_index].parent = n;
for (int i = 0; i < n; i++) {
if (HT[i].parent == -1 && ju2 == 0) {
min2 = HT[i].data;
min2_index = i;
ju2 = 1;
}
if (HT[i].parent == -1 && ju2 != 0 && min2 > HT[i].data) {
min2 = HT[i].data;
min2_index = i;
}
}
HT[min2_index].parent = n;
HT[n].data = HT[min2_index].data + HT[min1_index].data;
HT[n].lchild = min1_index;
HT[n].rchild = min2_index;
//printf("%d", HT[n].data);
}
void CreateHuffmanTree(Tree HT[], int n) {
int min1, min2, min1_index, min2_index;
int i;
for (i = n; i < 2 * n - 1; i++) {
select(HT, i);
HuffmanTree_print(HT, i);
printf("\n");
}
}
void HuffmanTree_erfodic(Tree HT[], int top) {
printf("%d ", HT[top].data);
if (HT[top].lchild != -1) {
HuffmanTree_erfodic(HT,HT[top].lchild);
}
if (HT[top].rchild != -1) {
HuffmanTree_erfodic(HT,HT[top].rchild);
}
}
int main() {
Tree* T=NULL;
int i;
int a[] = { 4,6,7,2,5,8,6,9 };
Tree HT[16];
//sort_data(a, 8);
InitHuffmanTree(HT, a, 8);
CreateHuffmanTree(HT, 8);
//HuffmanTree_print(HT, 8);
//data_print(a, 8);//输出数组元素
//createTree(T);
HuffmanTree_erfodic(HT,14);
printf("\n%d ", T);//输出树的根节点地址
return 0;
}