0

我有一个 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 节点的新位置。

4

1 回答 1

0

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

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);
}
于 2013-03-12T06:09:36.933 回答