2011-11-01 6 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); 
     } 
    } 
} 

Ben dize add() kullanarak kelimelerin dizisi if(t==NULL) segmentin içindeki baskılı alıyorsanız ancak ağaç kurdu yani düğümleri bağlantılı sakın almıyor eklediğinizde.Üçlü Arama Ağacı

cevap

4
t=temp; 

Bu hat add() fonksiyonun dışında hiçbir etkisi yoktur. Arayanın işaretçisi güncellenmedi.

Bir Ternary* (bunun sonunda bu durumda t dönmek) döndürecek şekilde işlev değiştirmek ve çağrı siteleri değişebilir:

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

veya ekleme olarak bağımsız değişken (Üçlü ** t, dizge s, int) ve daha sonra yapılacak * t geçici –

+0

yerine temp kullanarak = beyan ayrıca aşağıdaki çalıştı ifade t = yeni Üçlü (s [i]); Eğer ağaç = ... kullanırsam ve sonra ağacımın kök düğümünü kaybediyorum – CoderXX

+0

@ Pratik: 'add() 've' add komutunu kullanarak 'return t; Ben de belirttiğim gibi hiçbir şey kaybetmeyeceksin. – Mat

0

Sadece küçük bir hile yapar:

Değiştir

:

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

olarak:

Böyle çıkışını geçtikten sonra okuma daha temizdir

:

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

C++, sen işlev imzasını değiştirecek C'de referansları :) faydalanmak Ne zaman:

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

ve ilgili yerlerde t'u düzeltmeyi unutmayın.

O C++ açıkça temiz olduğunu :)