哈夫曼树C语言实现

//小顶堆
typedef struct{
    HTree a[MAXSIZE];
    int size;
}S;
int prarent(int i){
        return i/2;
    }
int right(int i){
        return 2*i+1;
    }
int left(int i){
        return 2*i;
    }
//插入元素
void insert(S* s,HTree n){
     s->size++;
     int i = s->size;
     while(i>1&&(s->a[prarent(i)]->c).freq>n->c.freq){
         s->a[i] = s->a[prarent(i)];
         i = prarent(i);
     }
     s->a[i] = n;
}
//维护堆
void Min_heap(S* s,int i){
    int l = left(i);
    int r = right(i);
    int min = i;
    if(l<=s->size&&(s->a[i]->c).freq>(s->a[l]->c).freq){
       min = l;
    }else{
       min = i;
    }
    if(r<=s->size&&(s->a[min]->c).freq>(s->a[r]->c).freq){
       min = r;
    }
    if(min!=i){
        HTree temp = s->a[i];
        s->a[i] = s->a[min];
        s->a[min] = temp;
        Min_heap(s,min);
    }
}
//删除并且返回最小元素
HTree Extract_min(S* s){
    if(s->size<1){
        printf("错误");
        return NULL;
    }
    HTree n = s->a[1];
    s->a[1] = s->a[s->size];
    s->size--;
    //维护堆
    Min_heap(s,1);
    return n;

}
//构造哈夫曼树
HTree HFUMAN(C* c,int len){
    S s;
    //对堆进行初始化
    s.size = 0;
    //首先将c插入优先队列
    for(int i = 0;i         HTree n = (HTree)malloc(sizeof(struct htree)*1);
        n->left = NULL;
        n->right = NULL;
        n->c = c[i];
        insert(&s,n);
    }
    //for(int i=1;i<=s.size;i++){
        //printf("%d",s.a[i]->c.freq);
    //}
    //在进行len-1次操作即可
    for(int i=0;i         HTree z = (HTree)malloc(sizeof(struct htree)*1);
        z->left = Extract_min(&s);
        z->right = Extract_min(&s);
        z->c.freq = z->left->c.freq+z->right->c.freq;
        insert(&s,z);
    }
    return Extract_min(&s);
}

效果

哈夫曼树C语言实现_第1张图片

 

你可能感兴趣的:(哈夫曼树C语言实现)