许多打印在最后没有注释掉,是debug时用的,参考了一些其他的博客,可以睡了,明天有是新的一周
#include <stdio.h>
#include <stdlib.h>
#define LEN 3
typedef struct Huffman{
int weight; //权重
struct Huffman* lch;
struct Huffman* rch;
}HuffmanNode,*HuffmanTree;
/*创建Huffman树*/
HuffmanTree CreateHuffman(int m[],int n);
/*寻找当前节点的最小与次小,返回节点下标*/
void Select(HuffmanTree HPtr[],int n,int* k1,int* k2);
/*先序遍历打印二叉树*/
void PreOrder(HuffmanTree HPtr);
/*打印二叉树*/
void PrintTree(HuffmanTree T,int i);
int main()
{
printf("1234\n");
int n = 6;
int w[6] = {0,1,2,3,4,5};
printf("1234\n");
HuffmanTree HPtr = CreateHuffman(w,n);
printf("Hello world!\n");
printf("%d\n",HPtr->weight);
PreOrder(HPtr);
printf("\nHello world!\n");
PrintTree(HPtr,LEN);
return 0;
}
/*创建Huffman树*/
HuffmanTree CreateHuffman(int w[],int n)
{
printf("我进来了\n");
HuffmanTree H_all[n];//保存节点
int i,k1,k2;
HuffmanTree H_root = NULL;//合并所用的根结点
printf("准备初始化\n");
printf("n = %d\n准备打印数组\n");
for(i = 0;i < n;i++)
printf("%d ",w[i]);
printf("\n");
/*初始化节点*/
for(i = 0;i < n;i++)
{
printf("i = %d\n",i);
H_all[i] = (HuffmanTree)malloc(sizeof(HuffmanNode)); //malloc
if(!H_all[i]) exit(-1); //defeat
(H_all[i]->weight) = w[i];
(H_all[i]->lch) = NULL;
(H_all[i]->lch) = NULL;
}
/*合并节点,需要合并n-1次*/
printf("已经初始化完成\n");
for(i = 1;i < n;i++)
{
/*找到最小值k1.次小值k2*/
Select(H_all,n,&k1,&k2);
/*申请结点*/
H_root = NULL;
H_root = (HuffmanTree)malloc(sizeof(HuffmanNode));//申请内存
if(!H_root) exit(-1);//失败
/*合并*/
H_root->weight = H_all[k1]->weight + H_all[k2]->weight;
H_root->lch = H_all[k1];
H_root->rch = H_all[k2];
/*将合并后的节点移植到k1,把k2置空*/
H_all[k1] = H_root;
H_all[k2] = NULL;
int j;
for(j = 0;j < n;j++)
{
if(H_all[j])
printf("H_all[%d]->weight = %d\n",j,H_all[j]->weight);
}
}
return H_root;
}
/*寻找当前节点的最小与次小,返回节点下标*/
void Select(HuffmanTree HPtr[],int n,int* k1,int* k2)
{
int i;
(*k1) = -1;
for(i = 0;i < n;i++)
{
if(HPtr[i] && (*k1) == -1)
{
(*k1) = i;
}
if(HPtr[i] && HPtr[i]->weight < HPtr[*k1]->weight)
{
(*k1) = i;
}
}
(*k2) = -1;
printf("k1 = %d ",(*k1));
for(i = 0;i < n;i++)
{
if(i != (*k1) && HPtr[i] && (*k2) == -1)
{
(*k2) = i;
printf("1~k2 = %d ",(*k2));
}
if((*k2) != -1 && HPtr[i] && HPtr[i]->weight < HPtr[*k2]->weight && i != (*k1))
{
(*k2) = i;
printf("2~k2 = %d ",(*k2));
}
}
printf("select函数运行结果:k1=%d,k2=%d\n",(*k1),(*k2));
}
/*先序遍历打印二叉树*/
void PreOrder(HuffmanTree HPtr)
{
if(HPtr)
{
printf("%d ",HPtr->weight);
PreOrder(HPtr->lch);
PreOrder(HPtr->rch);
}
}
void PrintTree(HuffmanTree T,int i)
{
if(T != NULL)
{
PrintTree(T->rch,i+LEN);
printf("%*d\n",i,T->weight);
PrintTree(T->lch,i+LEN);
i -= LEN;
}
}