2011-12-05 145 views
0

我創建了一個類二叉搜索樹。
但問題是,當我打印它崩潰的樹。
我認爲它可以在函數print()中進行無限遞歸。
爲什麼我不能打印二叉樹?

這裏是我的代碼

struct node{ 
node *l,*r; 
int data; 
}; 

class BinTree 
{ 
    private: node *root; 
    public: 
    BinTree(){ root=NULL; } 
    void add(int a){ add_node(a,root); }; 
    void add_node(int a, node *rot) 
    { node *curr; curr=rot; 
     if(curr==NULL) 
     { 
      curr=new node; 
      curr->data=a; 
      curr->l=NULL; 
      curr->r=NULL; 
      return; 
     } 
     if(a>=curr->data) curr=curr->r,add_node(a,curr); 
     if(a<curr->data) curr=curr->l,add_node(a,curr); 
    } 
    void print(){ inorder(root); } 
    void inorder(node *curr) 
    { 
    if(curr->l!=NULL) inorder(curr->l); 
    cout<<curr->data<<" "; 
    if(curr->r!=NULL) inorder(curr->r); 
    } 
}; 


誰能幫助我?

+0

至少肯定會在root爲NULL時崩潰 – onemach

+1

我看到兩個問題:第一個是什麼讓你的程序崩潰,如果你在調試器中運行該程序會很明顯。另一個是你永遠不會爲你的樹添加節點,使用調試器來遍歷'add_node'來查看原因。 –

回答

2

add_node壞了。如果currNULL,它會創建一個新節點,但它實際上從未將它添加到現有樹中。因此,所做的所有添加都會被有效忽略,並且樹保持空白。

inorder函數指針引用curr沒有檢查是否是NULL,並print調用它,而不檢查root是否NULL。因此,你的崩潰很可能是由於嘗試打印出一棵空樹,然後解引用一個空指針而引起的。

2

學習如何使用調試器。啓用編譯器中的所有警告。

在Linux上,這意味着編譯g++ -Wall -g和調試gdb

4

在你的add_node方法中,你永遠不會真的爲根分配一個值。它應該是這樣的:

if(curr==NULL) 
{ 
    curr=new node; 
    curr->data=a; 
    curr->l=NULL; 
    curr->r=NULL; 
    root = curr; 
    return; 
} 

但是,對於將來,我有與巴西爾相同的建議 - 使用你的編譯器和調試器到你的優勢。