Tworzę drzewo Huffmana i do tego zacząłem od zrobienia Min Sterty. Sterta jest skonfigurowana i pracuje sortując wartości według częstotliwości w dokumencie, ale mój problem pojawia się, gdy próbuję rozpocząć tworzenie drzewa.Drzewo Huffmana i wskazówki Huffmana
Pozbywam się dwóch najwyższych pozycji ze sterty i umieszczam węzeł nad nimi i ponownie umieszczam w stercie. Sterta jest oparta na tablicy, więc nie dotyka * lewego i * prawego wskaźnika węzłów. Kiedy sterta jest tylko w jednym węźle, jednak oba wskaźniki lewego i prawego węzła są puste, więc uważam, że może to być problem z moimi wskazówkami ...? Jestem nowicjuszem C++ z java, aby podać moje głupie błędy.
while(theHeap.getheapSize() > 1)
{
Node top;
Node *min1=new Node(theHeap.topandPop());
Node *min2=new Node(theHeap.topandPop());
top.left=min1;
top.right=min2;
top.freq=min1->freq+min2->freq;
theHeap.insert(top);
}
Node r=theHeap.topAndPop(); //null pointers for left and right children
--------------------------------------
//code for heap. arr is in the header file is Node *arr;
void Heap::insert(Node c)
{
if (heapSize != arrSize)
{
heapSize=heapSize+1;
arr[heapSize - 1] = c; //does this call copy constructor???
percolateUp(heapSize - 1);
}
}
void Heap::percolateUp(int nodeIndex) {
int parentIndex;
Node tmp;
if (nodeIndex != 0)
{
parentIndex = getParentPos(nodeIndex);
if (arr[parentIndex].freq > arr[nodeIndex].freq)
{
tmp = arr[parentIndex];
arr[parentIndex] = arr[nodeIndex];
arr[nodeIndex] = tmp;
percolateUp(parentIndex);
}
}
}
Czy rozważałeś użycie 'std :: priority_queue' dla sterty? –
To zadanie domowe i nie wolno nam korzystać ze standardowej biblioteki. – Westin
Aby upewnić się, że 'top' jest poza zakresem, więc miejmy nadzieję, że' insert() 'wywołuje konstruktor kopiowania zamiast tylko przyjmować adres? – Reinderien