代码是更大解决方案的一部分。 当我在prioriQueue中只有一个元素时,lastLeft和lastRight是nullptr。 任何想法如何改变这个算法只用一个元素核心工作,或一些提示如何更好地写它? 问题符合评论"这是一个问题"。
std::shared_ptr<Leaf> HUFFMAN::TreeGenerating()
{
std::shared_ptr<Leaf> lastLeft = nullptr; // addr of last left child
std::shared_ptr<Leaf> lastRight = nullptr; // addr of last right child
while (!prioriQueue.empty())
{
std::shared_ptr<Leaf> rightChild = std::make_shared<Leaf>();
std::shared_ptr<Leaf> leftChild = std::make_shared<Leaf>();
std::shared_ptr<Leaf> nRoot = std::make_shared<Leaf>();
if (prioriQueue.size() == 1) // getting last element from prioriQueue, this if end algorithm
{
*nRoot = getElement();
nRoot->setLeftChild(lastLeft);
nRoot->setRightChild(lastRight);
nRoot->setFreq(lastLeft->getFreq() + lastRight->getFreq()); // HERE IS A PROBLEM !!
nRoot->setValue(0);
return nRoot;
}
else
{
*leftChild = getElement();
*rightChild = getElement();
nRoot->setLeftChild(leftChild);
nRoot->setRightChild(rightChild);
nRoot->setFreq(leftChild->getFreq() + rightChild->getFreq());
nRoot->setValue(0);
lastLeft = leftChild;
lastRight = rightChild;
InsertIntoQueue(*nRoot);
}
}
}
答案 0 :(得分:0)
我会将此作为评论,因为OP的问题缺少太多的信息以获得正确答案,但对于评论来说太复杂了。请注意,代码完全未经测试,因为需要太多假设。
OP非常过于复杂。所需要的只是的内容std::shared_ptr<Leaf> HUFFMAN::TreeGenerating()
{
if (!prioriQueue.empty())
{
while (prioriQueue.size() > 1)
{
std::shared_ptr<Leaf> node = std::make_shared<Leaf>(getElement(),
getElement());
InsertIntoQueue(node);
}
return (getElement());
}
else
{
// handle the empty case
}
}
使用Leaf
构造函数:
Leaf::Leaf(std::shared_ptr<Leaf> right,
std::shared_ptr<Leaf> left)
{
rightChild = right;
leftChild = left;
freq = right->freq + left->freq
}
Leaf::Leaf(std::shared_ptr<Leaf> right,
std::shared_ptr<Leaf> left):
rightChild(right),
leftChild(left),
freq(right->freq + left->freq)
{
}
我还强烈建议您重新考虑对std::shared_ptr
的滥用行为。