哈夫曼编码-->输入权重,构造哈夫曼树并输出相应哈夫曼编码(c语言)
2015-10-23 19:03
543 查看
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 10
struct BinaryTreeNode{
int data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
};//使用二叉树结构来存放哈夫曼树
struct BinaryTreeNode* huffmanTreeArray;
void constructHuffman();
void quickSort(int start,int end);
void binaryInsert(int start,int end,struct BinaryTreeNode* huffmanTreeTemp);
void printHuffman(struct BinaryTreeNode* huffmanTree,int huffmanstring[],int index);
int main(){
int i,n=2*SIZE-2;
int huffmanstring[SIZE];
srand((int)time(NULL));
huffmanTreeArray=(struct BinaryTreeNode*)malloc(sizeof(struct BinaryTreeNode)*(2*SIZE-1));
for(i=0;i<SIZE;i++){
(huffmanTreeArray+i)->data=rand()%100;
(huffmanTreeArray+i)->left=NULL;
(huffmanTreeArray+i)->right=NULL;
printf("%d\t",(huffmanTreeArray+i)->data);
}//随机生成权重
printf("\n");
constructHuffman();//构造哈夫曼树
printHuffman(huffmanTreeArray+n,huffmanstring,0);//打印哈夫曼编码
return 0;
}
void constructHuffman(){
int n=SIZE;
int i=0;
quickSort(0,SIZE-1);//对已有数组按权重快速排序
while(n!=2*SIZE-1){
(huffmanTreeArray+n)->data=(huffmanTreeArray+i)->data+(huffmanTreeArray+i+1)->data;//将排好序的最小两个结点组合成新结点
(huffmanTreeArray+n)->left=huffmanTreeArray+i;
(huffmanTreeArray+n)->right=huffmanTreeArray+i+1;
i+=2;
binaryInsert(i,n-1,huffmanTreeArray+n);//将新结点二分插入到已排序数组中
n=n+1;
}
}
void quickSort(int start,int end){
int left=start,right=end;
int key=(huffmanTreeArray+left)->data;
if(start>=end){
return;
}
while(left<right){
while(left<right&&(huffmanTreeArray+right)->data>=key){
right--;
}
(huffmanTreeArray+left)->data=(huffmanTreeArray+right)->data;
while(left<right&&(huffmanTreeArray+left)->data<=key){
left++;
}
(huffmanTreeArray+right)->data=(huffmanTreeArray+left)->data;
}
(huffmanTreeArray+left)->data=key;
quickSort(left+1,end);
quickSort(start,left-1);
}
void binaryInsert(int start,int end,struct BinaryTreeNode* huffmanTreeTemp){
int mid,i;
int left=start,right=end;
struct BinaryTreeNode* temp;
temp=(struct BinaryTreeNode*)malloc(sizeof(struct BinaryTreeNode));
temp->data=huffmanTreeTemp->data;
temp->left=huffmanTreeTemp->left;
temp->right=huffmanTreeTemp->right;
while(left<=right){
mid=(left+right)/2;
if(huffmanTreeTemp->data==(huffmanTreeArray+mid)->data){
break;
}
else if(huffmanTreeTemp->data>(huffmanTreeArray+mid)->data){
left=mid+1;
}
else{
right=mid-1;
}
}
for(i=end;i>=left;i--){
(huffmanTreeArray+i+1)->data=(huffmanTreeArray+i)->data;
(huffmanTreeArray+i+1)->left=(huffmanTreeArray+i)->left;
(huffmanTreeArray+i+1)->right=(huffmanTreeArray+i)->right;
}
(huffmanTreeArray+left)->data=temp->data;
(huffmanTreeArray+left)->left=temp->left;
(huffmanTreeArray+left)->right=temp->right;
}
void printHuffman(struct BinaryTreeNode* huffmanTree,int huffmanstring[],int index){
int i;
if(huffmanTree->left==NULL&&huffmanTree->right==NULL){
printf("%d:",huffmanTree->data);
for(i=0;i<index;i++){
printf("%d",huffmanstring[i]);
}
printf("\n");
}
else{
if(huffmanTree->left!=NULL){
huffmanstring[index]=0;
printHuffman(huffmanTree->left,huffmanstring,index+1);
}
if(huffmanTree->right!=NULL){
huffmanstring[index]=1;
printHuffman(huffmanTree->right,huffmanstring,index+1);
}
}
}
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 10
struct BinaryTreeNode{
int data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
};//使用二叉树结构来存放哈夫曼树
struct BinaryTreeNode* huffmanTreeArray;
void constructHuffman();
void quickSort(int start,int end);
void binaryInsert(int start,int end,struct BinaryTreeNode* huffmanTreeTemp);
void printHuffman(struct BinaryTreeNode* huffmanTree,int huffmanstring[],int index);
int main(){
int i,n=2*SIZE-2;
int huffmanstring[SIZE];
srand((int)time(NULL));
huffmanTreeArray=(struct BinaryTreeNode*)malloc(sizeof(struct BinaryTreeNode)*(2*SIZE-1));
for(i=0;i<SIZE;i++){
(huffmanTreeArray+i)->data=rand()%100;
(huffmanTreeArray+i)->left=NULL;
(huffmanTreeArray+i)->right=NULL;
printf("%d\t",(huffmanTreeArray+i)->data);
}//随机生成权重
printf("\n");
constructHuffman();//构造哈夫曼树
printHuffman(huffmanTreeArray+n,huffmanstring,0);//打印哈夫曼编码
return 0;
}
void constructHuffman(){
int n=SIZE;
int i=0;
quickSort(0,SIZE-1);//对已有数组按权重快速排序
while(n!=2*SIZE-1){
(huffmanTreeArray+n)->data=(huffmanTreeArray+i)->data+(huffmanTreeArray+i+1)->data;//将排好序的最小两个结点组合成新结点
(huffmanTreeArray+n)->left=huffmanTreeArray+i;
(huffmanTreeArray+n)->right=huffmanTreeArray+i+1;
i+=2;
binaryInsert(i,n-1,huffmanTreeArray+n);//将新结点二分插入到已排序数组中
n=n+1;
}
}
void quickSort(int start,int end){
int left=start,right=end;
int key=(huffmanTreeArray+left)->data;
if(start>=end){
return;
}
while(left<right){
while(left<right&&(huffmanTreeArray+right)->data>=key){
right--;
}
(huffmanTreeArray+left)->data=(huffmanTreeArray+right)->data;
while(left<right&&(huffmanTreeArray+left)->data<=key){
left++;
}
(huffmanTreeArray+right)->data=(huffmanTreeArray+left)->data;
}
(huffmanTreeArray+left)->data=key;
quickSort(left+1,end);
quickSort(start,left-1);
}
void binaryInsert(int start,int end,struct BinaryTreeNode* huffmanTreeTemp){
int mid,i;
int left=start,right=end;
struct BinaryTreeNode* temp;
temp=(struct BinaryTreeNode*)malloc(sizeof(struct BinaryTreeNode));
temp->data=huffmanTreeTemp->data;
temp->left=huffmanTreeTemp->left;
temp->right=huffmanTreeTemp->right;
while(left<=right){
mid=(left+right)/2;
if(huffmanTreeTemp->data==(huffmanTreeArray+mid)->data){
break;
}
else if(huffmanTreeTemp->data>(huffmanTreeArray+mid)->data){
left=mid+1;
}
else{
right=mid-1;
}
}
for(i=end;i>=left;i--){
(huffmanTreeArray+i+1)->data=(huffmanTreeArray+i)->data;
(huffmanTreeArray+i+1)->left=(huffmanTreeArray+i)->left;
(huffmanTreeArray+i+1)->right=(huffmanTreeArray+i)->right;
}
(huffmanTreeArray+left)->data=temp->data;
(huffmanTreeArray+left)->left=temp->left;
(huffmanTreeArray+left)->right=temp->right;
}
void printHuffman(struct BinaryTreeNode* huffmanTree,int huffmanstring[],int index){
int i;
if(huffmanTree->left==NULL&&huffmanTree->right==NULL){
printf("%d:",huffmanTree->data);
for(i=0;i<index;i++){
printf("%d",huffmanstring[i]);
}
printf("\n");
}
else{
if(huffmanTree->left!=NULL){
huffmanstring[index]=0;
printHuffman(huffmanTree->left,huffmanstring,index+1);
}
if(huffmanTree->right!=NULL){
huffmanstring[index]=1;
printHuffman(huffmanTree->right,huffmanstring,index+1);
}
}
}