构造哈夫曼树算法
听的是哔哩哔哩上青岛大学王卓老师讲的数据结构
顺序存储结构的哈夫曼树大致是下面这个表类似的结构,有n个已知的位权,要求这个表,
表大致为
以下图片都是算法概括
基本思路
算法(伪代码)
以下是本人写的代码
其中那个select_twomin函数我想了好久,这个查找两个最小值的算法考虑的东西蛮多的。
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int weight;
int parent;
int lch;
int rch;
}Node,*node;// 定义哈夫曼树一个节点
//创建哈夫曼树
node createhafumatree(int n){
node tree = (node)malloc(sizeof(Node)*(2*n-1));
if(!tree){
exit(-1);
}
for(int i = 0;i < 2*n-1;i++){
tree[i].lch = tree[i].rch = tree[i].parent = -1;
if(i < n){
printf("\n请输入%d位置上的位权:",i);
scanf("%d",&tree[i].weight);
}
}
for(int i = n;i < 2*n-1;i++){
int min1,min2;
select_twomin(tree,i,&min1,&min2);
printf("min1 = %d,min2 = %d\n",min1,min2);
tree[i].weight = tree[min1].weight + tree[min2].weight;
tree[i].lch = min1;
tree[i].rch = min2;
tree[min1].parent = tree[min2].parent = i;
}
return tree;
}
//select_twomin:选择并赋值两个较小的数
void select_twomin(node t,int n,int* k1,int* k2){
int i = 0;
while(t[i].parent != -1){
i++;
}
*k1 = i;
i++;
while(t[i].parent != -1){
i++;
}
*k2 = i;
i++;
if(t[*k1].weight > t[*k2].weight){
int t = *k1;
*k1 = *k2;
*k2 = t;
}
while(i < n){
if(t[i].parent == -1){
if(t[i].weight < t[*k1].weight){
*k2 = *k1;
*k1 = i;
}else if(t[i].weight < t[*k2].weight){
*k2 = i;
}
}
i++;
}
}
void traveltree(node t,int n){
printf("number\tweight\tprarent\tleft\tright(prarent,left,right都为下标)");
putchar('\n');
for(int i = 0;i < 2*n-1;i++){
printf("%d\t%d\t%d\t%d\t%d",i,t[i].weight,t[i].parent,t[i].lch,t[i].rch);
putchar('\n');
}
}
int main(){
printf("请输入节点数:");
int n;
scanf("%d",&n);
node t = createhafumatree(n);
traveltree(t,n);
}
运行结果