У меня есть класс 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.
Если, как вы сказали, 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);
}
Других решений пока нет …