正在处于数据结构的学习中,用顺序表构造简易的哈夫曼树
【核心思想】1.比较出两个比较小的数
2.用两个比较小的数,组合一个根
3.用组合后的跟在和剩下的节点进行比较,反复
weigth | parent | lch | rch |
初始化weight赋值,并剩余所有的赋值为0,两数组合成新的数,修改parent的值,
(默认下标是从1开始的)
weigth | parent | lch | rch |
3 | 4 | 0 | 0 |
2 | 4 | 0 | 0 |
4 | 0 | 0 | 0 |
5 | 0 | 3 | 2 |
反复操作,直到剩余最后一个元素的双亲为0,无法比较久退出(或者可以循环2n-1次)
#include <stdio.h>
#include <malloc.h>
//用顺序表存储哈夫曼树
typedef struct {
int weight;
int parent,lch,rch;
}HTNode,*HuffmanTree;
//从数组里比较出最小的 返回的是最小的下标
int CompareNode(HuffmanTree* h,int n,int *minIndex){
// 用a来存储最小的值
int a;
// 用b来存储下标
int b=0;
// 找到第一个parent为0的值
for (int i = 1; i < 2*n-1; ++i) {
if(h[i]->parent==0){
a=h[i];
}
}
// 用第一个值和后面的值进行比较
for (int i = 1; i <=2*n-1; ++i){
if(h[i]->parent==0){
// 如果有比第一个parent为0小的值就进行转换
if(a<h[i+1]){
a=h[i+1];
b=i+1;
}
}
}
minIndex=b;
// 如果他就是最小的就返回他
return a;
}
//构造哈夫曼树
void CreatHuffmanTree(HTNode* node,int n,HuffmanTree *h,int a[]){
// 申请2n-1个节点
h=(HTNode *)malloc(sizeof (HTNode)*2*n-1);
// 初始化前n个数
for (int i = 1; i <= n; ++i) {
h[i]->weight=a[i];
h[i]->parent=0;
h[i]->lch=0;
h[i]->rch=0;
}
// 进行比较对比
for (int i = n+1; i <= 2*n-1; ++i) {
// 第一个小的下标
int min;
// 第一个小的数
int s1=CompareNode(h,n,&min);
// 将他的parent改为i
h[min]->parent=i;
int min2;
// 然后再找第二个数
int s2=CompareNode(h,n,&min2);
h[min]->parent=i;
h[i]=s1+s2;
h[i]->lch=min;
h[i]->rch=min2;
}
}
*****初学者,还望大佬指点*****