//根据Node数组建立Huffman树
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
char c;//字符
int val;//字符出现频次
struct Node* left;
struct Node* right;
}Node;
Node* DataArr[105];
int size=0;
Node* CreateHuffman();
int InsertCmp(const void* e1,const void *e2);
int CombineCmp(Node* p1,Node *p2);//排序的条件函数
Node* addtnode(Node* a,Node* b);
void OrderArr(int val,char c);
void InsertArr(Node *p,Node **NodeArr);//保持DataArr有序
void preOrder(Node *root);
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
int x;char ch;
scanf("%d %c",&x,&ch);
OrderArr(x,ch);
}
Node *root=NULL;
root=CreateHuffman();
//前两个节点合并,合并后保持有序
preOrder(root);
return 0;
}
Node* CreateHuffman(){
int l=0,r=size;
//用l表示删除,插入用qsort()
while(r-l>1){
Node* cur1=DataArr[l];
Node* cur2=DataArr[l+1];
l+=2;
size-=2;
Node* newNode=addtnode(cur1,cur2);
InsertArr(newNode,DataArr+l);//注意从l位置开始
r++;
}
return DataArr[r-1];
}
Node* addtnode(Node* a,Node* b){
Node* ret=(Node *)malloc(sizeof(Node));
ret->c=-1;
ret->val=a->val+b->val;
ret->left=a;
ret->right=b;
return ret;
}
int InsertCmp(const void* e1,const void *e2){
int p1=(*(Node**)e1)->val;
int p2=(*(Node**)e2)->val;
char c1=(*(Node**)e1)->c;
char c2=(*(Node**)e2)->c;
if(p1<p2){
return -1;
}else if(p1>p2){
return 1;
}else{
return c1-c2;
}
}
int CombineCmp(Node* p1,Node *p2){
//合并时有的节点c没有意义
if(p1->val<p2->val){
return -1;
}else{
return 1;//规定权值相同的情况,当前的节点放在后面
}
}
void OrderArr(int val,char c){
Node* p=(Node *)malloc(sizeof(Node));
p->c=c;
p->val=val;
p->left=p->right=NULL;
DataArr[size++]=p;
qsort(DataArr,size,sizeof(DataArr[0]),InsertCmp);
}
void InsertArr(Node *p,Node **NodeArr){
if(size==0){
NodeArr[size++]=p;
}
for(int i=0;i<size;i++){
if(CombineCmp(p,NodeArr[i])<0){
//原来i到i+1位置上,p放在i位置上
for(int j=size-1;j>=i;j--){
NodeArr[j+1]=NodeArr[j];
}
NodeArr[i]=p;
size++;
break;
}
}
//无法处理加到队尾
if(CombineCmp(p,NodeArr[size-1])>0){
NodeArr[size++]=p;
}
}
void preOrder(Node *root){
if(root==NULL){
return ;
}
printf("%d ",root->val);
//printf("%c\n",root->c);
preOrder(root->left);
preOrder(root->right);
}
哈夫曼树(C语言)
最新推荐文章于 2024-08-29 18:01:01 发布