объект — переполнение стека создания дерева Хаффмана

У меня есть класс Node, который имеет Node * left и Node * right в качестве переменных. Теперь у меня есть функция для построения дерева Хаффмана следующим образом

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

}

Это стандартная функция для создания дерева Хаффмана. Однако проблема заключается в следующем. Первоначально, когда создается новый узел * z и назначаются его левый и правый дочерние элементы, во время следующего выполнения цикла назначаются левый и правый дочерние элементы z, и я теряю изначально назначенные значения. У меня сложилось впечатление, что при каждом выполнении цикла создается новый объект, и его левый и правый дочерние элементы будут иметь разные области памяти. Но этого не происходит. Как сделать новый объект каждый раз, когда выполняется цикл. ??

Вот что я получаю

введите описание изображения здесь

При проверке узла с частотой 14 назначаются некоторые ячейки памяти при первом выполнении в качестве его левого и правого дочерних элементов. однако в следующем выполнении левый и правый дочерние узлы узла частоты 14 будут нулевыми, а дочерние узлы узла частоты 25 будут установлены в предыдущие местоположения. я ожидаю, что они будут одинаковыми, назначенными во время первого раунда для узла с частотой 14, и новые местоположения для узла с частотой 25.

0

Решение

Если, как вы сказали, pQueue — это вектор объектов Node (и я предполагаю, что std :: vector — если нет, игнорируйте ответ!), Используя vector :: insert (), вы фактически добавляете итератор, а не Узловой объект. Попробуйте что-то вроде этого:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]