ハフマン ツリーから正しくポップするのに問題があります。現在、minheap に基づいてハフマン ツリーを作成しており、次のことを行いたいと考えています。
A と B が 2 つの異なるサブツリーであると仮定すると、A の頻度が B の頻度よりも低い場合、A が最初にポップオフされると言えます。それらが同じ頻度である場合、A の葉ノードのいずれかで ASCII 値の最小文字を見つけます。次に、A の最小の文字リーフ ノードが B のリーフ ノードよりも小さいかどうかを確認します。もしそうなら、私はBの前にAをポップオフします。そうでなければ、Bをポップオフします. <-これは私が問題を抱えていることです.
例えば:
私が入力したとしましょう:
eeffgghh\n (every letter except for \n's frequency which is 1 is 2)
私のハフマンツリーに。次に、私のツリーは次のようになります。
9
/ \
5 4
/ \ / \
3 h g f
/\
e \n
以下は、Huffman minheap から飛び出すための私の試みです。2つの文字の頻度が同じかどうかを比較する部分に問題があります. 誰かが助けてくれれば、それは素晴らしいことです。ありがとう!
void minHeap::heapDown(int index)
{
HuffmanNode *t = new HuffmanNode();
if(arr[index]->getFreq() == arr[left]->getFreq() || arr[index]->getFreq() == arr[right]->getFreq()) //arr is an array of HeapNodes
{
if(arr[left]->getLetter() < arr[right]->getLetter())
{
t = arr[index]; //equals operator is overloaded for swapping
arr[index] = arr[left];
arr[left] = t;
heapDown(left);
}
else
{
t = arr[index];
arr[index] = arr[right];
arr[right] = t;
heapDown(right);
}
}
if(arr[index]->getFreq() > arr[left]->getFreq() || arr[index]->getFreq() > arr[right]->getFreq())
{
if(arr[left]->getFreq() < arr[right]->getFreq())
{
t = arr[index];
arr[index] = arr[left];
arr[left] = t;
heapDown(left);
}
else
{
t = arr[index];
arr[index] = arr[right];
arr[right] = t;
heapDown(right);
}//else
}//if
}