哈夫曼树具体实现

哈夫曼树的结构体里定义的变量有父节点,左孩子节点,右孩子节点,权重

创建哈夫曼树从下往上先建立孩子节点,然后添加父节点。

添加节点时,要挑选出两个权重最小的节点。

具体操作如下:

#include<iostream>
#include<string>
using namespace std;
#define OK 1
#define ERROR -1
typedef string *HuffmanCode;

typedef struct{
  int weight;
  int parent, lchild, rchild;
}HTNode,*HuffmanTree;

int Select(HuffmanTree HT, int n, int &s1, int &s2)
{
 int m1, m2, i = 0;
 m1 = m2 = 32767;
 while (i < n)
 {
  if (HT[i].parent == 0)
  {
   if (HT[i].weight < m1)
   {
    m2 = m1;
    s2 = s1;
    m1 = HT[i].weight;
    s1 = i;
   }
   else if (HT[i].weight < m2)
   {
    m2 = HT[i].weight;
    s2 = i;
   }
  }
  i++;
 }
 return s1,s2;
}


int HuffmanCoding(HuffmanTree &HT, int *w, int n)
{
 if (n <= 1)
  return ERROR;
 HuffmanTree p;
 int i = 0, s1 = 0, s2 = 0;
 int m = 2 * n - 1;
 HT = (HuffmanTree)malloc((m + 1)*sizeof(HTNode));
 for (p = HT; i < n; ++i, ++p)
 {
  *p = { w[i], 0, 0, 0 };
 }
 for (; i < m; ++i, ++p)
 {
  *p = { 0, 0, 0, 0 };
 }
 for (i = n; i < m; ++i)
 {
  Select(HT, i, s1, s2);
  HT[i].lchild = s1;
  HT[i].rchild = s2;
  HT[i].weight = HT[s1].weight + HT[s2].weight;
  HT[s1].parent = i;
  HT[s2].parent = i;
 }
 
 for (i = 0; i < n; ++i)
 {
  int cd[100]; int start;
  for (int j = 0; j < 100; j++)
   cd[j] = 3;
  start = n - 1;
  for (int c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)
  {
   if (HT[f].lchild == c)
    cd[--start] = 0;
   else
    cd[--start] = 1;
  }
  
  for (int i = 0; i<n; i++)
  {
   if (cd[i]!=3)
   cout << cd[i] << ' ';
  }
  cout << endl;
 }
 
 return OK;
}

int main()
{
 HuffmanTree HT;
 int  n , w[100];
 cout << "你将要输入多少个数据:";
 cin >> n;
 cout << "输入数据应为int型"<<endl;
 for (int i = 0; i < n; i++)
 {
  cin >> w[i];
 }
 cout << "字符编码为:" << endl;
 HuffmanCoding(HT,  w, n);
 
 return 0;
}

posted @ 2016-11-28 21:08  ll7  阅读(268)  评论(0编辑  收藏  举报