2012-03-09 117 views
0

我正在用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]; 
} 

关于这个问题可能有什么想法?

+1

如果你在调试器中运行您的程序,你会发现哪一行导致崩溃,然后你可以从那里向后工作。 – 2012-03-09 08:31:52

回答

0

呜呜......

// create a new node 
Node * sum; 

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

您在这里缺少= new Node();零件。

0

马修M.已经发现了一个错误:这里的另一个:

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