HuffmanTree.h文件
#ifndef HUFFMANTREE
#include<stdlib.h>
#include<stdio.h>
#define MaxCapacity 1000
#define MAXDATA 0xFFFF
typedef struct HuffmanNode
{
int weight;
struct HuffmanNode* lchild;
struct HuffmanNode* rchild;
}HuffmanTree;
typedef struct HEAP {
HuffmanTree* *data;
int size;
int capacity;
}Heap;
typedef Heap MinHeap;
MinHeap* CreatMinHeap(int MaxSize);
bool HeapInsert(MinHeap*& h, HuffmanTree* item);
bool IsFull(MinHeap* H);
bool IsEmpty(MinHeap* H);
HuffmanTree* HeapDelete(MinHeap*& h);
void BuildMinHeap(MinHeap*& h);
HuffmanTree* CreatHuffmanTree(MinHeap*& h);
HuffmanTree* NewHuffmanNode();
void PreOrderTraversal(HuffmanTree* BST);
#endif
#pragma once
HuffmanTree.cpp文件
#include "HuffmanTree.h"
MinHeap* CreatMinHeap(int MaxSize)
{
MinHeap* h;
HuffmanTree* T;
h = (MinHeap*)malloc(sizeof(MinHeap));
if (!h)
{
printf("最小堆初始化失败");
return NULL;
}
h->data = (HuffmanTree**)malloc(sizeof(HuffmanTree*) * (MaxCapacity + 1));
if (!h->data)
{
printf("最小堆data初始化失败");
return NULL;
}
h->capacity = MaxCapacity;
h->size = 0;
T = NewHuffmanNode();
h->data[0] = T;
return h;
}
HuffmanTree* NewHuffmanNode()
{
HuffmanTree* BST;
BST = (HuffmanTree*)malloc(sizeof(HuffmanTree));
if (!BST)
{
exit(-1);
}
BST->weight = 0;
BST->lchild = BST->rchild = NULL;
return BST;
}
bool IsFull(MinHeap* H)
{
return (H->size == H->capacity);
}
bool IsEmpty(MinHeap* H)
{
return (H->size == 0);
}
bool HeapInsert(MinHeap*& h, HuffmanTree* item)
{
int i;
if (IsFull(h))
{
printf("堆已满");
return false;
}
h->size++;
for (i = h->size; h->data[i / 2]->weight > item->weight; i /= 2)
{
h->data[i] = h->data[i / 2];
}
h->data[i] = item;
return true;
}
HuffmanTree* HeapDelete(MinHeap*& h)
{
int parent, child;
HuffmanTree* Minitem, * temp;
if (IsEmpty(h))
{
printf("堆空");
return NULL;
}
Minitem = h->data[1];
temp = h->data[h->size--];
for (parent = 1; parent * 2 <= h->size; parent = child)
{
child = parent * 2;
if ((child + 1 <= h->size) && h->data[child]->weight > h->data[child + 1]->weight)
{
child++;
}
if (temp->weight > h->data[child]->weight)
{
h->data[parent] = h->data[child];
}
else
{
break;
}
}
h->data[parent] = temp;
return Minitem;
}
void BuildMinHeap(MinHeap*& h)
{
int i;
int child, parent;
HuffmanTree* temp;
for (i = h->size / 2; i > 0; i--)
{
temp = h->data[i];
for (parent = i; parent * 2 < h->size; parent = child)
{
child = parent * 2;
if ((child + 1 <= h->size) && h->data[child]->weight > h->data[child + 1]->weight)
{
child++;
}
if (temp->weight > h->data[child]->weight)
{
h->data[parent] = h->data[child];
}
else
{
break;
}
}
h->data[parent] = temp;
}
}
HuffmanTree* CreatHuffmanTree(MinHeap*& h)
{
int i, num;
HuffmanTree* T;
T = (HuffmanTree*)malloc(sizeof(HuffmanTree));
if (!T)
{
printf("哈夫曼树初始化失败");
return NULL;
}
BuildMinHeap(h);
num = h->size - 1;
for (i = 0; i < num; i++)
{
T = NewHuffmanNode();
T->lchild = HeapDelete(h);
T->rchild = HeapDelete(h);
T->weight = T->lchild->weight + T->rchild->weight;
HeapInsert(h, T);
}
return T;
}
void PreOrderTraversal(HuffmanTree* BST)
{
if (BST) {
printf("%d ", BST->weight);
PreOrderTraversal(BST->lchild);
PreOrderTraversal(BST->rchild);
}
}
main.cpp
#include<stdio.h>
#include<stdlib.h>
#include "HuffmanTree.h"
void main()
{
int i, n;
MinHeap* h;
HuffmanTree* T, *BT = NULL;
printf("输入叶子结点个数: \n");
scanf_s("%d", &n);
h = CreatMinHeap(2 * n);
printf("请输入%d个叶子结点对应的权值:\n", n);
for (i = 1; i <= n; i++)
{
T = NewHuffmanNode();
scanf_s("%d", &(T->weight));
h->data[++(h->size)] = T;
}
BT = CreatHuffmanTree(h);
printf("先序遍历此哈夫曼树的权值:\n");
PreOrderTraversal(BT);
}