2014-09-25 33 views
0

我正在編碼打印出BST預訂和後續遍歷。打印BST遍歷錯誤 - 分割錯誤

的分類定義這樣

class BinSearchTree{ 
    char symbol; 
    BinSearchTree *lChild; 
    BinSearchTree *rChild; 

public: 
BinSearchTree(char letter) { symbol = letter;lChild = NULL; rChild = NULL;} 
    BinSearchTree() { symbol = '0';} 
    BinSearchTree* buildTree(BinSearchTree *tree, char letter); 
    void printTreePreOrder (BinSearchTree *temp, std::ofstream &fp1); 
    void printTreeInOrder (BinSearchTree *temp, std::ofstream &fp1); 
}; 

我用一個簡單的遞歸創建BST

BinSearchTree* BinSearchTree::buildTree(BinSearchTree *tree, char letter){ 
    if (tree == NULL) { 
    tree = new BinSearchTree (letter); 
    return tree; 
    } 
    else { 
     if (letter<(tree->symbol)) 
     { 
       tree->lChild = (BinSearchTree*) buildTree(tree->lChild, letter); 
       return tree; 
     } 
     else{ 
       tree->rChild = (BinSearchTree*) buildTree(tree->rChild, letter); 
       return tree; 
     } 
     } 
    return tree; 
} 

但是,當我打印出來的穿越,我得到段故障。我使用這段代碼序和後序

void BinSearchTree::printTreePreOrder (BinSearchTree *temp, std::ofstream &fp1) { 
    if (temp == NULL){ 
     return; 
    } 
    else{ 
     fp1 << symbol << " "; 
     printTreePreOrder(lChild, fp1); 
     printTreePreOrder(rChild, fp1); 
    } 
} 

類似的東西在我的主要代碼,我創建一個使用

T = new BinSearchTree(str[0]); 
    for(i=1; i<num; i++){ 
     fp >> str[i]; 
     T->buildTree(T,str[i]); 
    } 

,做遍歷使用

T->printTreePreOrder(T,fp1) 

我有我的樹自從幾天以來一直試圖找出錯誤,我認爲這是一個愚蠢的錯誤。任何幫助表示讚賞。

PS - 使用Ubuntu 14.04並使用G ++編譯器。

回答

0

首先,您需要確定您想要遍歷算法在類中還是在類之外。現在該方法屬於類,但接收類的類型的參數(這看起來很奇怪,在這種情況下是錯誤的)。

void BinSearchTree::printTreePreOrder (BinSearchTree *temp, std::ofstream &fp1);

正確的簽名應該是:在這種情況下,你使用的是實際的節點作爲根代碼會遍歷

void BinSearchTree::printTreePreOrder(std::ofstream &fp1)類似:

void BinSearchTree::printTreePreOrder(std::ofstream &fp1) { 
    fp1 << symbol << " "; 
    if (lChild != NULL) 
     printTreePreOrder(lChild, fp1); 
    if (rChild != NULL) 
     printTreePreOrder(rChild, fp1); 
} 

或者,如果功能超出課程範圍:

void printTreePreOrder(BinSearchTree *temp, std::ofstream &fp1) { 
    if (temp == NULL) 
     return ; 
    else { 
     fp1 << temp->symbol << " "; 
     if (temp->lChild != NULL) 
      printTreePreOrder(temp->lChild, fp1); 
     if (temp->rChild != NULL) 
      printTreePreOrder(temp->rChild, fp1); 
    } 
} 

在這種情況下,您需要訪問會員symbollChildrChild,在實際實現中都是私有的(或者將方法聲明爲朋友)。

你的問題是你是小姐匹配參數和成員變量,如:

在你調用printTreePreOrder方法:T->printTreePreOrder(T,fp1)在這種情況下tempTlChildrChild將是T孩子的,有這裏是沒有問題的,讓假設兩個子存在,則打印的Tsymbol並在此調用調用printTreePreOrder(lChild, fp1);temp等於lChild,但lChildrChild已經指的的T成員變量,一個這是問題。

在你的情況可能更好是in class因爲沒有聲明members variables publicfriend

方法buildTree(它與printThreePreOrder有同樣的問題,你不需要返回任何東西,新的數據被插入到實際節點中或者被轉發給其中一個子節點,不需要任何回報:

代碼會是這樣的(類版本):

void BinSearchTree::buildTree(char letter){ 
    if (letter < tree->symbol) { 
     if (lChild == NULL) 
      lChild = new BinSearchTree(letter); 
     else 
      lChild->buildTree(letter); 
    } else { 
     if (rChild == NULL) 
      rChild = new BinSearchTree(letter); 
     else 
      rChild->buildTree(letter); 
    } 
} 
+0

謝謝,這解決了我得到段錯誤的問題,但輸出仍然是錯誤的。在創建樹的方式中是否存在錯誤?我使用了第二種方法,您提出的函數不在類中。 – user3706865 2014-09-25 12:43:42

+0

已更新的答案,請參閱新的建議。 – NetVipeC 2014-09-25 13:08:09