2017-01-04 16 views
-1

Код является частью более крупного решения. Когда у меня есть только один элемент в prioriQueue, lastLeft и lastRight имеют значение nullptr. Любые идеи о том, как изменить этот алгоритм, чтобы работать по-разному только с одним элементом или с некоторыми подсказками, как написать его лучше? Проблема соответствует комментарию «ЗДЕСЬ ПРОБЛЕМА».Huffman Coding Создание дерева C++

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

Off Topic: Похоже, вы злоупотребляете 'std :: shared_ptr'. Рекомендовать читать aa [Какой тип указателя я использую, когда?] (Http://stackoverflow.com/questions/8706192/which-kind-of-pointer-do-i-use-when) – user4581301

+0

Я не могу использовать Unique_ptr becouse of operation u не вижу в моем посте. – ArekJastrzebski

ответ

0

Я бы уронить это как комментарий, потому что вопрос 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 
} 

или с помощью Member Initializer List

Leaf::Leaf(std::shared_ptr<Leaf> right, 
      std::shared_ptr<Leaf> left): 
    rightChild(right), 
    leftChild(left), 
    freq(right->freq + left->freq) 
{ 
} 

Я также настоятельно рекомендую пересмотреть это злоупотребление std::shared_ptr.