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 ++的新手,所以我对指针不太熟悉,但这就是我用其他语言做这个函数的方法。