您的位置:首页 > 编程语言 > C语言/C++

哈夫曼编码-->输入权重,构造哈夫曼树并输出相应哈夫曼编码(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);

}

}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: