【问题标题】:Huffman Tree Creation C++霍夫曼树创建 C++
【发布时间】:2013-02-27 12:05:07
【问题描述】:

我有一个 Node *left 和 Node *right 作为变量的类 Node。现在我有一个函数来构建哈夫曼树,如下所示

int x = pQueue.size();

for(int i=0;i<x-1;i++){

    Node *z = new Node;
    z->left = &pQueue.extractMin();
    z->right = &pQueue.extractMin();
    z->setchar(NULL);
    z->setfrequency(z->left->getFrequency() + z->right->getFrequency());
    pQueue.insert(z);

}

这是创建霍夫曼树的标准函数。然而问题是这样的。最初,当创建一个新的 Node* z 并分配其左右子节点时,在循环的下一次执行期间,z 的左右子节点被重新分配,并且我丢失了最初分配的值。我的印象是,在每次执行循环期间,都会创建新对象,并且其左右子对象将具有不同的内存位置。但这并没有发生。每次循环执行时如何创建一个新对象??

这是我得到的

如果您检查频率为 14 的节点在第一次执行中分配了一些内存位置作为其左右子节点。但是在下一次执行中,频率 14 节点的左右子节点为空,频率 25 节点的子节点设置为先前的位置。我希望它们在第一轮中分配给频率 14 节点和频率 25 节点的新位置。

【问题讨论】:

  • 给出一个预期结果和你得到的结果的样本?
  • 我刚刚添加了图片和我的期望
  • pQueue的类型是什么?
  • pQueue 是 Node 对象的向量。
  • stl 向量?没有 extractMin 成员函数

标签: c++ object loops memory huffman-code


【解决方案1】:

如果,如您所说,pQueue 是 Node 对象的向量(我假设 std::vector - 如果不是,请忽略答案!),通过使用 vector::insert(),您实际上是在添加一个迭代器而不是 Node 对象。试试这样的:

int x = pQueue.size();

for(int i=0;i<x-1;i++){

    Node z;
    z.left = &pQueue.extractMin();
    z.right = &pQueue.extractMin();
    z.setchar(NULL);
    z.setfrequency(z.left->getFrequency() + z.right->getFrequency());
    pQueue.push_back(z);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多