Huffman Tree,递归函数崩溃(指针未正确中继)

时间:2016-12-28 10:57:50

标签: c++ pointers huffman-code

struct node {
    float weight;
    char value;
    node* left_child;
    node* right_child;
};

void get_codes(node tree, std::string code, std::map<char, std::string> &codes)
{
    if(!tree.left_child && !tree.right_child) // leap node
        codes[tree.value] = code;
    else
    {
        get_codes(*tree.left_child, code + "0", codes);
        get_codes(*tree.right_child, code + "1", codes);
    }
}

int main()
{
    std::string test {"this is an example of a huffman tree"};
    std::vector<char> alphabet = get_alphabet(test);
    std::vector<float> weights = get_weights(test, alphabet);

    std::priority_queue<node, std::vector<node>, is_node_greater> heap;
    for(int i=0; i<alphabet.size(); i++)
    {
        node x;
        x.weight = weights[i];
        x.value = alphabet[i];
        x.left_child = nullptr;
        x.right_child = nullptr;
        heap.push(x);
    }

    while(heap.size() > 1)        {
        node fg = heap.top(); heap.pop();
        node fd = heap.top(); heap.pop();
        node parent;
        parent.weight = fg.weight + fd.weight;
        parent.left_child = &fg;
        parent.right_child = &fd;
        heap.push(parent);
    }
    node tree = heap.top(); // our huffman tree

    std::map<char, std::string> codes;
    get_codes(tree, "", codes);
}

在第一个循环中,我构建了一个包含所有跳跃节点的堆(优先级队列),即没有左子节点,没有右子节点(nullptr)。

在第二个循环中,当堆包含多个节点时,我采用权重最小的两个节点,并创建一个父节点,将这两个节点作为子节点。父节点的权重是两个孩子的总和。

然后我有我的霍夫曼树,我必须得到霍夫曼码。也就是说,我需要为每个跳跃节点获取一个二进制代码,假设位'0'表示跟随左子节点,位'1'表示跟随右子节点。

这就是我的函数get_codes应该做的,以及崩溃发生的地方。它永远不会进入'if'语句,所以recursivity永远不会停止,所以我认为它永远不会到达跳跃节点,但它应该因为每次在子树上调用函数;或者跳跃节点/ nullptr已丢失..?我是C ++的新手,所以我对指针不太熟悉,但这就是我用其他语言做这个函数的方法。

0 个答案:

没有答案