霍夫曼树中的左和右节点指针没有指向任何东西

时间:2015-03-23 20:39:04

标签: c++ queue allocation huffman-code

struct Node{
    int freq;
    string character;

    struct Node *left;
    struct Node *right;
};

我已经解析了一个文件并创建了节点的优先级队列。每个节点都有一个频率int,一个字符串用于在节点中表示的字符。还有两个用于左右分支的Node指针。

以下代码位于主函数中。

priority_queue<Node, vector<Node>, CompareNodes> pq;

// Build Tree //
while( pq.size() > 1 )
{
    Node * l = new Node;
    Node * r = new Node;

    Node r1 = pq.top();
    r->character = r1.character;
    r->freq = r1.freq;
    pq.pop();

    Node l1 = pq.top();
    l->character = l1.character;
    l->freq = l1.freq;
    pq.pop();


    Node * combined = new Node;
    combined->character = l1.character + r1.character;
    combined->freq = l1.freq + r1.freq;
    combined->left = l;
    combined->right = r;

    pq.push(*combined);

}

运行上面的代码并检查每个左右指针后,超出第一级的所有左右指针都是NULL。

基本上,从根向上移动树是不可能的。只有第一个左右指针指向节点。所有其他孩子左/右指针都没有领先。

我感觉我没有正确分配空间。每次传递后的位置* l和* r仍然可以访问并包含一个节点吗?或者它们是while循环的本地,并在每次传递后被删除?

1 个答案:

答案 0 :(得分:0)

答案就像Mike Vine解释的那样。

  

您正在使用队列。当您在进入和退出队列时复制节点时,您将丢失信息。一个&#34; easy&#34;修复将是在您第一次输入时使用队列Node *并新建节点。这与上面删除l和r变量的修复相结合将使这工作(你还需要更改CompareNodes比较器以通过指针获取。更正确的修复将是像队列unique_ptr Node那样你可以有更好的终身管理,但你需要做更多的改变。

谢谢你,迈克。