需要帮助构建基数树c ++

时间:2012-03-09 08:29:17

标签: c++

我正在使用huffman编码在c ++中构建基数树。我得到了一个算法可以遵循,我写的内容似乎应该可以工作,但它一直在崩溃。

我正在遵循这个算法:

  • 使用计数器,以便您知道构造何时完成(N个字符需要此算法的N-1个循环)。
  • 通过指针数组,找到“根”节点的两个最小频率。
  • 创建一个新节点,存储(b)中找到的频率之和,将(b)中找到的节点存储为其子节点,将该节点中的一个指针替换为该新节点的地址,并使另一个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];
}

对问题可能是什么的任何想法?

2 个答案:

答案 0 :(得分:0)

...坎

// create a new node
Node * sum;

这是创建节点。这是声明指向Node未初始化指针。

您在这里缺少= new Node();部分。

答案 1 :(得分:0)

Matthieu M.已经发现了一个错误:另一个:

// find two smallest.
    Node * p1 = 0;
    Node * p2 = 0;
    p1->left = p1->right = p2->right = p2->left = 0;