2011-11-01 68 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)段,但树是没有得到形成即节点没有得到连接。三元搜索树

回答

4
t=temp; 

此行在add()函数之外没有任何作用。调用者的指针未更新。

你可以改变你的函数返回一个Ternary*(在这种情况下,在它的结束返回t),并更改呼叫网站:

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

或声明参数作为附加(三元**吨,字符串s,int i)以和然后执行* T =温度 –

+0

代替使用温度,我也试过以下陈述 t =新的三元组(s [i]); 如果我使用tree = ...那么我会失去树的根节点 – CoderXX

+0

@Pratik:除了在'add()'的末尾加'return t;'并且使用'add “正如我所表明的那样,你不会失去任何东西。 – Mat

0

只是一个小动作都会做的事:

替换:

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

有了:

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++显然吸尘器:)