2012-03-09 122 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;