// ConsoleApplication11.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
//哈夫曼树类HuffmanTree的定义
/*Huffman树结点类TreeNode声明*/
template<class T>
class HuffmanNode
{
private:
HuffmanNode<T>* LLINK;//指向左右孩子的指针
HuffmanNode<T>* RLINK;
T INFO;//数据域
int weight;//权值
public:
HuffmanNode() {}//构造函数
HuffmanNode<T>* GetLeft(void)const { return LLINK; }
void SetLeft(HuffmanNode<T>*L) { LLINK = L; }
HuffmanNode<T>*GetRight(void)const { return RLINK; }
void SetRight(HuffmanNode<T> *R) { RLINK = R; }
T& GetData() { return INFO; }
void SetData(const T& item) { INFO = item; }
int GetWeight() { return weight; }//返回weight域
void SetWeight(const int w) { weight = w; }//将weight域更新为w
};
/*Huffman树类HuffmanTree声明*/
template<class T>
class HuffmanTree
{
private:
int m;//Huffman树结点个数
HuffmanNode<T> *H;//Huffman树结点的数组
public:
HuffmanTree() { m = 0;H = NULL; }//构造函数
void CreatHuffanTree(T data[], int weight[], int n);//创建哈夫曼树
//其他操作
HuffmanNode<T> *GetRoot() { return m == 0 ? NULL : H[m]; }
void PreOrder(HuffmanNode<T>*t)const;
void InOrder(HuffmanNode<T>*t)const;
};
//创建Huffman树
template<class T>
void HuffmanTree<T>::CreatHuffanTree(T data[], int weight[], int n)
{
m = n;
H = new HuffmanNode<T> *[m + 1];
HuffmanNode<T> *p1, *p2, *p, *t;
int i, j;
for (i = 1;i <= m;i++)
{
H[i] = new HuffmanNode<T>();
H[i]->SetDate(data[i]);
H[i]->SetWeight(weight[i]);
H[i]->SetLeft(NULL);
H[i]->SetRight(NULL);
}
for (i = 1;i < m;i++)
{
t = new HuffmanNode<T>();
p1 = H[i];
p2 = H[i + 1];
t->SetWeight(p1->GetWeight() + p2->GetWeight());
t->SetLeft(p1);
t->SetRight(p2);
p = t;
j = i + 2;
while (j <= m && (p->GetWeight()) > (H[j]->GetWeight()))
{
H[j - 1] = H[j];
j = j + 1;
}
H[j - 1] = p;
}
}
int main()
{
std::cout << "Hello World!\n";
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门提示:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
1.用堆操作
typedef struct TreeNode *HuffmanTree;
struct TreeNode
{
int Weight;
HuffmanTree Left,Right;
}
HuffmanTree Huffman(MinHeap H)
{
/* 假设H->Size个权值已经存在H->Elements[]->Weight里*/
int i;
HuffmanTree T;
BuildMinHeap(H);/*将H->Elements[]按权值调整为最小堆*/
for(i=1;i<H->Size;i++)
{
T=malloc(sizeof(struct TreeNode));
/*建立新结点*?
T->Left=DeleteMin(H);
/*从最小堆中删除一个结点,作为新T的左子结点*/
T->Right=DeleteMin(H);
/*从最小堆中删除一个结点,作为新T的右子结点*/
T->Weight=T->Left->Weight+T->right->Weight;
Insert(H,T);
}
T=DeleteMin(H);
return T;
}
2.给定字符串,对字符串编码,使得该字符串的编码存储空间最少