哈夫曼书和哈夫曼编码

来源:互联网 发布:淘宝服装模特招聘 编辑:程序博客网 时间:2024/06/04 18:04
#include<cstdio>#include<iostream>#include<algorithm>using namespace std;template <class Type>class hfTree{  private:    struct Node    {      Type data;      int weight;      int parent,left,right;    };    Node* elem;    int length;  public:    struct hfCode{      Type data;      string code;    };    hfTree(const Type* x,const int* w,int size);    void getCode(hfCode result[]);    ~hfTree() { delete [] elem; }};template <class Type>hfTree <Type>::hfTree(const Type* v,const int* w,int size){  const int MAX_INT = 2147483647;  int min1, min2;  int x, y;  length = 2 * size;  cout<<"size is "<<size<<endl;  cout<<"length is "<<length<<endl;  elem = new Node[length];  for(int i = size; i < length; i++)  {    elem[i].weight = w[i-size];    elem[i].data = v[i-size];    elem[i].parent = elem[i].left = elem[i].right = 0;  }  for(int i = size; i < length; i++)  cout<<elem[i].data<<" "<<elem[i].weight<<" "<<endl;  for(int i = size-1; i > 0; i--)  {    min1 = min2 = MAX_INT;    x = y = 0;    for(int j = i+1; j < length; j++)      if(elem[j].parent == 0)        if(elem[j].weight < min1)        { min2 = min1; min1 = elem[j].weight; x = y; y = j; }        else if(elem[j].weight < min2)        { min2 = elem[j].weight; x = j; }    elem[i].weight = min1 + min2;    elem[i].left = x;    elem[i].right = y;    elem[i].parent = 0;    elem[x].parent = i;    elem[y].parent = i;  }  for(int i = 1; i < length; i++)cout<<elem[i].data<<" "<<elem[i].weight<<" "<<elem[i].parent<<" "<<elem[i].left<<" "<<elem[i].right<<endl; }  template <class Type>void hfTree<Type>::getCode(hfCode result[]){  int size = length/2;  int p, s;  for(int i = size; i < length; i++)  {    result[i-size].data = elem[i].data;    result[i-size].code = "";    p = elem[i].parent;    s = i;    while(p) {      if(elem[p].left == s)        result[i-size].code = '0' + result[i-size].code;      else result[i-size].code = '1' + result[i-size].code;      s = p;      p = elem[p].parent;    }  }}int main(){  char ch[] = { "aeistdn" };  int w[] = { 10, 15, 12, 3, 4, 13, 1 };  hfTree<char>tree(ch,w,7);  hfTree<char>::hfCode result[7];  tree.getCode(result);  for(int i = 0; i < 7; i++)  cout<<result[i].data<<' '<<result[i].code<<endl;  return 0;}

原创粉丝点击