为什么我的哈夫曼代码的节点没有正确排序?C

为什么我的哈夫曼代码的节点没有正确排序?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 &

我试着调试我的哈夫曼代码,发现了当我调用buildHuffmanTree并使用下面注释的print函数打印我的minHeap节点时,我得到了一个分段错误:11,因为我的哈夫曼树中只有5个节点,而我期望有11个由原始6个字母组成,加上5个内部节点,它们是它们的频率之和。有人能帮我解决这个问题吗

    #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){