【面试准备】数据结构-Huffman树

来源:互联网 发布:磁石发热知乎 编辑:程序博客网 时间:2024/06/05 01:04
#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;}

0 0
原创粉丝点击