2011-12-05 15 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

2つの問題があります。まず、プログラムがクラッシュする原因は、デバッガでプログラムを実行すると明らかになります。もう一つは、ツリーにノードを追加することは決してないということです。なぜなら、デバッガを使って 'add_node'を実行してその理由を調べるというものです。 –

答えて

2

g++ -Wall -gとデバッグでコンパイルすることを意味します。 currNULLの場合、新しいノードが作成されますが、実際には既存のツリーに追加されることはありません。したがって、すべての追加は効果的に無視され、ツリーは空のままです。

inorder機能は、それがNULLであるかどうかを確認せずにcurrを逆参照し、printrootNULLであるかどうかを確認せずにそれを呼び出します。したがって、あなたのクラッシュは、tryinが空のツリーを出力してからヌルポインタの参照を外すことによって発生する可能性が最も高いです。

2

Learn デバッガの使用方法コンパイラにすべての警告をで有効にします。 Linuxの

、これはあなたのadd_nodeが壊れているgdb

4

add_nodeメソッドでは、実際にはルートに値を割り当てません。それはこのようなものでなければなりません:

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

しかし、将来のために、私はバジーレと同じアドバイスがある - あなたのadvantangeにあなたのコンパイラとデバッガを使用します。

関連する問題