0

これまでのところ、ハフマンコーディングプログラムのノードのバイナリツリーを作成するプログラムを作成しました。何らかの理由で、デバッガーが2つの子がNullに等しいかどうかをテストするポイントに到達すると(したがって、親だけでなくツリー上に実際の文字が存在する)、プログラムはフリーズします。Codesは、2つのメンバー変数を持つCode構造体で構成される各オブジェクトのコードの配列です。

void Huff::traverse(Node* root, vector<Code>* code, string code_base){
    if(root->childL == NULL && root->childR == NULL){ //stops here
        Code c;
        c.content = root->litteral;
        c.symbol = code_base;
        code->push_back(c);
    }else{
        if (root->childL != NULL)
            traverse(root->childL, code, code_base + '0');
        if (root->childR != NULL)
            traverse(root->childR, code, code_base + '1');
    }
}

これを呼び出す関数は次のとおりです(最後に呼び出されます):

vector<Code>* Huff::compress(){
    //-------GETTING WEIGHTS/FREQUENCIES------
    vector<Node *>* nodes = new vector<Node*>; // Vector of nodes for later use
    map<char, int>* freq = new map<char, int>; //  Map to find weight of nodes
    for(unsigned int i = 0; i < content.length(); i++)
        (*freq)[content[i]]++; 
    CopyTo copyto(nodes); //sets vector<Node*> to copy to 
    for_each(freq->begin(), freq->end(), copyto); // Copies 
    delete freq;
    vector<Node *>::iterator beg = nodes->begin();

    //-------SETTING UP TO BUILD TREE------
    if(nodes->size() % 2 == 1){ //makes sure there are an even number of nodes
        Node* fill = new Node;
        fill->set_node(0, '*', NULL, NULL);
        nodes->push_back(fill);
    }
    huff_sort(nodes); // sort nodes by weight

    //-------BUILDING TREE------
    while(nodes->size() != 1){ //Sorts nodes by weight and then removes two of them and replaces them with one
        int w= (**beg).weight + (**(beg+1)).weight;
        Node* p = new Node;
        p->set_node(w, '*', *nodes->begin(), *(nodes->begin()+1)); //making it the parent node of the two lowest nodes
        nodes->erase(nodes->begin(), nodes->begin()+2);
        unsigned int i = 0;
        while(w > (*nodes)[i]->weight && i <= nodes->size()){ //finds where to insert the parent node based on weight
            i++;
        }
        if(i > nodes->size()) //if it needs to be inserted at the end
            nodes->push_back(p);
        else
            nodes->insert(nodes->begin()+i, p);
        delete p;
    }

    //-------TRAVERSING TREE------
    Node* root = (*nodes)[0];
    delete nodes;
    vector<Code>* codes;
    traverse(root, codes , "");
    delete root;
    return codes;
}

注:コードのトラバースツリーブロックの前のwhileループは、ツリーが作成される場所です

4

2 に答える 2

1

root何かを指しているかどうかを確認します( if (root) ...)。これは役立つはずです。

于 2012-07-24T17:42:19.297 に答える
1

delete nodes;あなたが電話した後にあなたは言う必要がありますtraverse。あなたが今持っているものはあなたが電話する前にroot指摘します。NULLtraverse

于 2012-07-24T17:46:44.340 に答える