设计一函数,生成Huffman树,算法描述如下: 每次选HuffTree数组中权值最小的两个元素,其中最小值作为树的左孩子,次小值做为树的右孩子,并将该树的根结点作为Huffuman树的非叶子结点。为了保存它们之间的逻辑关系,需保存以下信息: 设置左、右孩子的parent 将根结点的权值设置为左、右孩子权值之和 设置根结点的lchild、rchild
时间: 2023-05-29 08:01:31 浏览: 261
struct HuffNode{
int weight; // 权值
int parent; // 父节点
int lchild; // 左孩子
int rchild; // 右孩子
};
void Huffman(int n, int* weight, HuffNode* HuffTree){ // n为叶子节点数,weight存储权值,HuffTree存储Huffman树
int m = 2*n - 1; // 总节点数
for(int i=0; i<n; i++){
HuffTree[i].weight = weight[i];
HuffTree[i].parent = -1;
HuffTree[i].lchild = -1;
HuffTree[i].rchild = -1;
}
for(int i=n; i<m; i++){
int min1 = -1, min2 = -1; // 最小权值和次小权值
for(int j=0; j<i; j++){
if(HuffTree[j].parent == -1){ // 没有父节点的是叶子节点
if(min1 == -1 || HuffTree[j].weight < HuffTree[min1].weight){
min2 = min1;
min1 = j;
}else if(min2 == -1 || HuffTree[j].weight < HuffTree[min2].weight){
min2 = j;
}
}
}
HuffTree[min1].parent = i;
HuffTree[min2].parent = i;
HuffTree[i].lchild = min1;
HuffTree[i].rchild = min2;
HuffTree[i].weight = HuffTree[min1].weight + HuffTree[min2].weight;
}
}
阅读全文