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

Posted

技术标签:

【中文标题】霍夫曼树中的左右节点指针不指向任何东西【英文标题】:Left and Right Node pointers in Huffman tree not pointing to anything 【发布时间】:2015-05-27 00:19:39 【问题描述】:
struct Node
    int freq;
    string character;

    struct Node *left;
    struct Node *right;
;

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

以下代码位于main函数中。

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。

基本上,从根部向上爬树是不可能的。只有第一个 left 和 right 指针指向一个 Node。所有其他的子左/右指针都不指向哪里。

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

【问题讨论】:

你不需要更新 l 和 r - 只需使用现有的 l1 和 r1 作为组合->左和组合->右 我已经删除了 l 和 r。我用它们只是为了确定。代码的功能仍然相同。 l1 和 r1 的地址应该仍然存在并且应该被传递给新的父节点。但是跟踪它们并尝试将它们打印出来或查看它们的内容会无济于事,并使程序崩溃。 好的,我想我可以看到问题所在。您正在使用queue&lt;Node&gt;。当您在节点进入和退出队列时复制节点时,您将丢失信息。一个“简单”的解决方法是在您第一次输入节点时使用queue&lt;Node*&gt;new。这与删除 l 和 r 变量的上述修复相结合将使这项工作(您还需要更改 CompareNodes 比较器以通过指针获取。更正确的解决方法是使用类似 queue&lt;unique_ptr&lt;Node&gt;&gt; 的东西,然后你可以有更好的生命周期管理,但你需要做更多的改变。 【参考方案1】:

答案正如 Mike Vine 所解释的那样。

您正在使用队列。当您在节点进入和退出队列时复制节点时,您将丢失信息。一个“简单”的解决方法是使用队列 Node* 并在您首次输入节点时新建节点。这与删除 l 和 r 变量的上述修复相结合将使这项工作(您还需要将 CompareNodes 比较器更改为也按指针获取。更正确的修复是拥有类似队列 unique_ptr 节点的东西,然后你可以拥有更好的生命周期管理,但您需要进行更多更改。

谢谢你,迈克。

【讨论】:

以上是关于霍夫曼树中的左右节点指针不指向任何东西的主要内容,如果未能解决你的问题,请参考以下文章

哈夫曼树中的“权值”是指啥?

哈夫曼树及其编码

温故而知新, 哈夫曼树(Huffman tree)

赫夫曼树及赫夫曼编码

哈夫曼树

遍历霍夫曼树