今晚实现了一个huffman树. 明晚实现huffman编码
/**/
/*
* 文件名:huffman.cpp
* 描述:实现一个huffman树
* 创建日期:2007-11-18
*/
#include < iostream >
using namespace std;
const int MAX = 1000 ; // 最大权值
struct hufnode
... {
int w; // 权值
int left; // 左结点
int right;
int par; // 父结点
} ;
void huffman( struct hufnode * ar, int n)
... {
int m1, m2; //存放最小的两个元素 , m1 >= m2
int x1, x2; // 最小的两个元素的下标
int i, j, m, k; // 遍历数组的迭代量
for(m = n, k = n; k < 2*n-1; m--, k++)
...{
m1 = MAX;
m2 = MAX;
x1 = 0;
x2 = 0;
i = 0;
j = 0;
while(i < m)
...{
if(ar[j].par == -1)
...{
if(ar[j].w < m1)
...{
m1 = ar[j].w;
x1 = j;
}
if(ar[j].w < m2)
...{
m1 = m2;
m2 = ar[j].w;
x1 = x2;
x2 = j;
}
i++;
} // if(ar[i] == -1)
j++;
} // while(i)
// create huffman tree
ar[k].left = x1;
ar[k].right = x2;
ar[k].w = ar[x1].w + ar[x2].w;
ar[x1].par = k;
ar[x2].par = k;
} // for(m,k)
}
int main()
... {
struct hufnode *ar;
int n;
int i;
cout << "Please input the leaves number N:";
cin >> n;
ar = new struct hufnode[2*n-1];
// 初始化
for(i = 0; i < 2*n-1; i++)
...{
ar[i].left = -1;
ar[i].right = -1;
ar[i].w = 0;
ar[i].par = -1;
}
// 输入前n个结点权值
for(i = 0; i < n; i++)
cin >> ar[i].w;
huffman(ar, n);
for(i = 0; i < 2*n-1; i++)
cout << ar[i].w << ' ';
delete [] ar;
return 0;
}
* 文件名:huffman.cpp
* 描述:实现一个huffman树
* 创建日期:2007-11-18
*/
#include < iostream >
using namespace std;
const int MAX = 1000 ; // 最大权值
struct hufnode
... {
int w; // 权值
int left; // 左结点
int right;
int par; // 父结点
} ;
void huffman( struct hufnode * ar, int n)
... {
int m1, m2; //存放最小的两个元素 , m1 >= m2
int x1, x2; // 最小的两个元素的下标
int i, j, m, k; // 遍历数组的迭代量
for(m = n, k = n; k < 2*n-1; m--, k++)
...{
m1 = MAX;
m2 = MAX;
x1 = 0;
x2 = 0;
i = 0;
j = 0;
while(i < m)
...{
if(ar[j].par == -1)
...{
if(ar[j].w < m1)
...{
m1 = ar[j].w;
x1 = j;
}
if(ar[j].w < m2)
...{
m1 = m2;
m2 = ar[j].w;
x1 = x2;
x2 = j;
}
i++;
} // if(ar[i] == -1)
j++;
} // while(i)
// create huffman tree
ar[k].left = x1;
ar[k].right = x2;
ar[k].w = ar[x1].w + ar[x2].w;
ar[x1].par = k;
ar[x2].par = k;
} // for(m,k)
}
int main()
... {
struct hufnode *ar;
int n;
int i;
cout << "Please input the leaves number N:";
cin >> n;
ar = new struct hufnode[2*n-1];
// 初始化
for(i = 0; i < 2*n-1; i++)
...{
ar[i].left = -1;
ar[i].right = -1;
ar[i].w = 0;
ar[i].par = -1;
}
// 输入前n个结点权值
for(i = 0; i < n; i++)
cin >> ar[i].w;
huffman(ar, n);
for(i = 0; i < 2*n-1; i++)
cout << ar[i].w << ' ';
delete [] ar;
return 0;
}