2011-11-01 10 views
5
struct Ternary { 

    char current; 
    bool wordend; 
    Ternary* left; 
    Ternary* mid; 
    Ternary* right; 
    Ternary(char c='@',Ternary* l=NULL, Ternary* m=NULL, Ternary* r=NULL,bool end=false) 
    { 
     wordend=end; 
     current=c; 
     left=l; 
     mid=m; 
     right=r; 
    } 
}; 

void add(Ternary* t, string s, int i) { 

    if (t == NULL) { 
     Ternary* temp = new Ternary(s[i],NULL,NULL,NULL,false); 
     t=temp; 
    } 

    if (s[i] < t->current) { 
     add(t->left,s,i); 
    } 
    else if (s[i] > t->current) { 
     add(t->right,s,i); 
    } 
    else 
    { 
     if (i + 1 == s.length()) { 
      t->wordend = true; 
     } 
     else 
     { 
      add(t->mid,s,i+1); 
     } 
    } 
} 

私はadd()文字列を使用して単語の列を追加すると if(t==NULL)セグメントが、ツリーはすなわちノードがリンク取得されていない形成されて取得されていないの内側に印刷されてきています。3分探索木

答えて

4
t=temp; 

この行は、add()機能の外では何の効果もありません。呼び出し元のポインタは更新されません。

あなたが(それの終わりに、この場合のtを返す)Ternary*を返す、とに呼び出しサイトを変更するには、機能を変更することができます:ほんの少しトリックを行います

Ternary *tree = 0; 
tree = add(tree, "hello", 1); 
tree = add(tree, "bye", 1); 
... 
+0

やアドオンなどの引数を(三項は、** tは、文字列s、私はint型)、次にやる* tは一時 –

+0

代わりの一時を使用して=宣言し、私はまた、次のことを試してみましたステートメント t =新しい3進数(s [i]); もし私がtree = ...を使用していたら、ツリーのルートノードが失われています – CoderXX

+0

@Pratik:コード内の何も変更せずに、 'add()'の最後に 'return t;'を置き、 'add 「私が指摘したように、あなたは何も失うことはありません。 – Mat

0

は交換してください:

void add(Ternary* t, string s, int i) 

で:

合格してから、このような出力を読み込むよりもきれいだ

tree = add(tree, "bye", 1); 

C++で、彼らの参照の使用を行うと:) Cでは、あなたはに関数のシグネチャを変更します

void add(Ternary** t, string s, int i) 

関連する場所でtを修正することを忘れないでください。

さて、C++ははっきりきれいです:)

関連する問題