2013-03-12 134 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); 
}