霍夫曼树创作C ++

时间:2013-03-12 04:34:24

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

我有一个Node节点,它有Node * left和Node * right作为变量。现在我有一个函数来构建huffman树,如下所示

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的左右子项,并且我将丢失最初分配的值。我的印象是,在每次执行循环期间,都会创建新对象,并且其左右子节点将具有不同的内存位置。但这不会发生。如何在每次执行循环时创建一个新对象。??

这是我得到的

enter image description here

如果检查频率为14的节点,则在第一次执行时将某些内存位置指定为其左右子节点。但是在下一次执行中,频率14节点的左右子节点为空,频率为25节点的子节点设置为先前的位置。我希望它们在频率14节点的第一轮和频率25节点的新位置分配相同。

1 个答案:

答案 0 :(得分:0)

如果你正如你所说,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);
}