私はハフマンエンコーディングを使ってC++で基数ツリーを構築しています。私はフォローするアルゴリズムを与えられました。私が書いたことはうまくいくはずですが、クラッシュしています。基数木を構築する助けが必要です。C++
私はこのアルゴリズムを以下午前:工事が完了したときにあなたが知っているように、
- は(Nの文字は、このアルゴリズムのN-1ループが必要な)カウンタを使用してください。
- 「ルート」ノードの2つの最小頻度を見つけるポインタの配列を渡します。
- 新しいノードを作成し、(b)で見つかったノードからの頻度の合計を格納し、(b)で見つかったノードをその子として格納し、配列内のポインタの1つをこの新しいノードのアドレスに置き換え、他を0にします。
- 結果をテストするには、BSTDumpを使用します。左右の割り当て方法と「新しいルート」によって、結果が異なることに注意してください。
私は、この機能で自分の結果をテストしようとしています:ここで
void BSTDump(Node * r)
{
static bool first = true;
if (first)
{
cout << "Parent Left Right" << endl
<< "---------------------" << endl;
first = false;
}
if (r != 0)
{
BSTDump(r->left);
BSTDump(r->right);
cout << setw(4) << r->theChar << r->freq;
if (r->left != 0)
cout << setw(8) << r->left->freq;
else
cout << setw(8) << '*';
if (r->right != 0)
cout << setw(8) << r->right->freq << endl;
else
cout << setw(8) << '*' << endl;
}
}
は、ノードの構造である:
struct Node
{
double freq;
char theChar;
Node * left;
Node * right;
};
そして、ここでは、私がどの構築機能で書かれているものです何が正しく動作していないのですか。
void ConstructTree(Node * &r)
{
Node * N[ASIZE];
for (int i = 0; i < ASIZE; i++)
{
N[i] = new Node;
assert(N[i] != 0);
N[i]->left = N[i]->right = 0;
cout << "Enter the char and its frequency: ";
cin >> N[i]->theChar >> N[i]->freq;
}
int Num = ASIZE;
while (Num > 1)
{
// find two smallest.
Node * p1;
Node * p2;
//p1->theChar = p2->theChar = N[0]->theChar;
//p1->freq = p2->freq = N[0]->freq;
//p1->left = p1->right = p2->right = p2->left = 0;
p1 = p2 = N[0];
for(int i = 0; i < ASIZE; i++)
{
if(N[i]->freq > p1->freq){
//p2->theChar = p1->theChar;
//p2->freq = p1->freq;
//p1->theChar = N[i]->theChar;
//p1->freq = N[i]->freq;
p2 = p1;
p1 = N[i];
}
}
// create a new node
Node * sum = new Node;
sum->freq = p1->freq + p2->freq;
sum->left = p2;
sum->right = p1;
// update array N contents
N[Num] = sum;
delete sum;
Num--;
}
// make certain that r knows where the root is
r = N[0];
}
何が問題なのか?
、あなたはクラッシュの原因行を発見するでしょう、そしてあなたはそこから逆方向に動作することができます。 –