为什么我的哈夫曼代码的节点没有正确排序?C
我试着调试我的哈夫曼代码,发现了当我调用buildHuffmanTree并使用下面注释的print函数打印我的minHeap节点时,我得到了一个分段错误:11,因为我的哈夫曼树中只有5个节点,而我期望有11个由原始6个字母组成,加上5个内部节点,它们是它们的频率之和。有人能帮我解决这个问题吗为什么我的哈夫曼代码的节点没有正确排序?C,c,arrays,tree,heap,huffman-code,C,Arrays,Tree,Heap,Huffman Code,我试着调试我的哈夫曼代码,发现了当我调用buildHuffmanTree并使用下面注释的print函数打印我的minHeap节点时,我得到了一个分段错误:11,因为我的哈夫曼树中只有5个节点,而我期望有11个由原始6个字母组成,加上5个内部节点,它们是它们的频率之和。有人能帮我解决这个问题吗 #include <stdio.h> #include <stdlib.h> #include <string.h> #include &
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define SIZE 100000
char arr[SIZE];
int freq[SIZE];
int arr2[SIZE];
int qTop = 0;
int size=0;
struct node{
char data;
int frequency;
struct node* left;
struct node* right;
};
struct node* PQ[SIZE];
struct node* newNode(char data, int frequency){
struct node* t = (struct node*)malloc(sizeof(struct node));
t->data = data;
t->frequency= frequency;
t->left = NULL;
t->right = NULL;
return (t);
}
void minHeapify(struct node* PQ[], int x){
int frequency = PQ[x]->frequency;
char data = PQ[x]->data;
int i=x; //the current node
int j= 2*i; //the left node
while(j<=qTop){
if (j<qTop && (PQ[j+1]->frequency < PQ[j]->frequency)){
j=j+1; //the right node
}
if (PQ[j]->frequency < frequency){
PQ[i]->frequency = PQ[j]->frequency;
PQ[i]->data = PQ[j]->data;
i=j;
j=2*i;
} else{
break;
}
}
}
void push(struct node* PQ[], struct node* node){
if (qTop==SIZE){
printf("PQ OVERFLOW \n");
} else{
qTop=qTop+1;
int i = qTop;
int j = (int)(i/2);
while (i > 1 && PQ[j]->frequency > node->frequency){
PQ[i] = PQ[j];
i = j;
j = (int)(i/2);
}
PQ[i] = node;
}
}
struct node* pop(struct node* PQ[]){
if (qTop==0){
printf("PQ UNDERFLOW \n");
return NULL;
} else{
struct node* node = PQ[1];
PQ[1] = PQ[qTop];
qTop = qTop - 1;
minHeapify(PQ,1);
return node;
}
}
void printCodes(struct node* root, int arr2[], int top) {
if (root->left) {
arr2[top] = 0;
printCodes(root->left, arr2, top + 1);
}
if (root->right) {
arr2[top] = 1;
printCodes(root->right, arr2, top + 1);
}
if (root->left == NULL && root->right == NULL) {
printf("%c: ", root->data);
for (int i = 0; i < top; i++){
printf("%d", arr2[i]);
}
printf("\n");
}
}
void buildHuffmanTree(char arr[], int freq[]){
for (int i=0;i<strlen(arr);i++){
struct node* node = newNode(arr[i],freq[i]);
push(PQ,node);
size++;
}
int PQsize=0;
for (int i=1; i<size;i++){
PQsize++;
struct node* node2 = newNode('!',0);
node2->left = pop(PQ);
node2->right = pop(PQ);
struct node* nodeL=node2->left;
struct node* nodeR=node2->right;
node2->frequency = nodeL->frequency + nodeR->frequency;
push(PQ,node2);
}
/*
for (int i=1;i<PQsize,i++){
printf("%c:%d \n",PQ[i]->data,PQ[i]->frequency);
}
*/
struct node* root= pop(PQ);
int top=0;
printCodes(root,arr2,top);
}
int main(){
char arr[] = "abcdef";
int freq[] = { 5, 9, 12, 13, 16, 45 };
buildHuffmanTree(arr,freq);
return 0;
}
因此,我的编码错误,程序输出:
c: 00
a: 010
b: 011
!: 10
!: 110
e: 111
而不是:
a: 1100
b: 1101
c: 100
d: 101
e: 111
f: 0
请帮助我理解为什么在我将所有节点插入minHeap后,它们都变得混乱。谢谢。
PQ
是指针数组。第一次调用push
时,这些指针均未分配任何内容<代码>推送执行:
qTop=qTop+1;
int i = qTop;
int j = (int)(i/2);
while (i > 0 && PQ[j]->frequency > node->frequency){
此时,
i
大于零,但未为PQ[j]
赋值。从这一点开始,程序的行为就没有定义。我认为这就像调用PQ[(int)(I/2)],其中(int)(1/2)是节点PQ[I]的父节点。
qTop=qTop+1;
int i = qTop;
int j = (int)(i/2);
while (i > 0 && PQ[j]->frequency > node->frequency){