#include <iostream>
using namespace std;
//Hanfuman树节点类
template<class T>
class HuffmanNode {
private:
HuffmanNode<T> *left, *right;
T data;
int weight;
public:
HuffmanNode() {
;
}
HuffmanNode(HuffmanNode<T>* L, HuffmanNode<T>* R, T item, int w) {
left = L;
right = R;
data = item;
weight = w;
}
HuffmanNode<T>* GetLeft() {
return left;
}
void SetLeft(HuffmanNode<T>* L) {
left = L;
}
HuffmanNode<T>* GetRight() {
return right;
}
void SetRighht(HuffmanNode<T>* R) {
right = R;
}
T& GetData() {
return data;
}
void SetData(T item) {
data = item;
}
int& GetWeight() {
return weight;
}
void SetWeight(int w) {
weight = w;
}
};
#define MAX 20
//Hanfuman树类
template<class T>
class HuffmanTree {
private:
HuffmanNode<T>* root;
T data[MAX];
int weight[MAX];
int Length; //记录/huffman节点数目
public:
HuffmanTree(HuffmanNode<T>* t = NULL) {
root = t;
Length = 0;
}
HuffmanNode<T>* GetRoot() {
return root;
}
void SetRoot(HuffmanNode<T>* t) {
root = t;
}
void InputNodes(T stop_flag, int stop); //输入各节点的数据和权值
void CreateHuffmanTree(T stop_flag, int stop); //创建Huffman树
void Show(HuffmanNode<T>* t);
void Show_z(HuffmanNode<T>* t);
};
//输入时,需根据权值的从小到大输入,乱序输入则需加排序=-=
template<class T>
void HuffmanTree<T>::InputNodes(T stop_flag, int stop) {
T item;
int item_int;
cout << "请以”数据域 权值“的形式输入一组节点.输入" << stop_flag << " " << stop << "终止!"
<< endl;
cin >> item >> item_int;
while (item != stop_flag && item_int != stop) {
data[Length] = item;
weight[Length] = item_int;
Length++;
cin >> item >> item_int;
}
return;
}
template<class T>
void HuffmanTree<T>::CreateHuffmanTree(T stop_flag, int stop) {
InputNodes(stop_flag, stop);
HuffmanNode<T>* H[Length];
HuffmanNode<T> *p1, *p2, *p;
int i = 0, j = 0;
for (i = 0; i < Length; i++) {
H[i] = new HuffmanNode<T>;
H[i]->SetData(data[i]);
H[i]->SetWeight(weight[i]);
H[i]->SetLeft(NULL);
H[i]->SetRighht(NULL);
}
for (i = 0; i < Length - 1; ++i) {
p = new HuffmanNode<T>;
p1 = H[i];
p2 = H[i + 1];
p->SetWeight(p1->GetWeight() + p2->GetWeight());
p->SetLeft(p1);
p->SetRighht(p2);
j = i + 2;
while (j < Length && p->GetWeight() > H[j]->GetWeight()) {
H[j - 1] = H[j];
j = j + 1;
}
H[j - 1] = p;
}
root = H[Length - 1];
}
template<class T>
void HuffmanTree<T>::Show(HuffmanNode<T>* t) {
HuffmanNode<T>* p = t;
if (p != NULL) {
cout << p->GetData() << endl;
Show(p->GetLeft());
Show(p->GetRight());
}
return;
}
template<class T>
void HuffmanTree<T>::Show_z(HuffmanNode<T>* t) {
if (t != NULL) {
Show_z(t->GetLeft());
cout << t->GetData() << endl;
Show_z(t->GetRight());
}
return;
}
int main() {
HuffmanTree<int> *p = new HuffmanTree<int>;
p->CreateHuffmanTree(0, 0);
p->Show(p->GetRoot());
cout << "***************" << endl;
p->Show_z(p->GetRoot());
return 0;
}
【面试准备】数据结构-Huffman树
最新推荐文章于 2024-04-19 14:19:17 发布