我所定義的二進制樹是這樣的:沒有指針的遞歸結構? (霍夫曼)
struct btree {
int x;
btree* left_child = nullptr;
btree* right_child = nullptr;
};
然後,我有浮標(prob_distr
)的矢量和我將每個浮動成葉和我把所有的葉子成一個優先級隊列(與一個自定義的排序功能,但這裏沒關係)。
auto comp = [] (btree &a, btree &b) -> bool { return a.x > b.x; };
priority_queue<btree, vector<btree>, decltype(comp)> q(comp);
for(auto t: prob_distr)
{
btree leaf;
leaf.x = t;
q.push(leaf);
}
對於Huffman算法,我然後循環所述優先級隊列中,直到它只有1個元件左:我走2個節點在頂部從隊列中,創建與這兩個節點作爲新的節點孩子們,我把這些新節點放入隊列中。
while(q.size() >= 2)
{
btree left = q.top(); q.pop();
btree right = q.top(); q.pop();
btree root;
root.x = left.x + right.x;
root.left_child = &left;
root.right_child = &right;
q.push(root);
}
的問題是,我有一個指針到left
和right
二叉樹,並走出去while循環的時候,這些樹將被刪除。然後我有指針指向什麼。有沒有什麼辦法可以解決這個問題,例如,通過一個存儲子樹的結構而不僅僅是指針,或者通過將結點存儲在其他地方而沒有太複雜的結構?
有沒有辦法解決這個問題。不,你不能沒有指針的遞歸結構。你需要正確處理指針,這是一個很難的要求,這是沒有辦法的。 –
當'left'是局部變量時,指定'root.left_child =&left'是錯誤的。你應該做一些像'btree * left = new btree(q.top())'。然後,你可以分配'root.left_child = left'。 'right'也一樣。 –