2013-03-12 135 views
0

我有一个类节点,它有Node *左和Node *右作为变量。现在我必须建立哈夫曼树的功能如下霍夫曼树创建C++

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节点的新位置分配相同。

+0

给出一个预期的结果和你得到的结果的样本? – uba 2013-03-12 04:36:34

+0

我刚添加了照片和我的期望 – Maverick 2013-03-12 04:45:53

+0

'pQueue'的类型是什么? – uba 2013-03-12 05:44:04

回答

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); 
}