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

Khi tôi thêm chuỗi các từ sử dụng add() chuỗi đang nhận được in bên trong if(t==NULL) phân khúc nhưng cây không bị hạch tức là hình thành không nhận được liên kết.ternary Search Tree

Trả lời

4
t=temp; 

Dòng này không có tác dụng bên ngoài chức năng add(). Con trỏ của người gọi không được cập nhật.

Bạn có thể thay đổi chức năng của bạn để trả lại một Ternary* (trở t trong trường hợp này ở phần cuối của nó), và thay đổi các trang web cuộc gọi đến:

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

hoặc kê khai lập luận như add (ternary ** t, chuỗi s, int i) và sau đó làm * t = tạm –

+0

Thay vì sử dụng tạm thời, tôi cũng đã cố gắng như sau tuyên bố t = new Ternary (s [i]); Và nếu tôi sử dụng cây = ... thì im mất nút gốc của cây của cây – CoderXX

+0

@Pratik: không thay đổi bất kỳ thứ gì trong mã của bạn ngoại trừ việc đặt 'return t;' ở cuối 'add()' và sử dụng 'add như tôi đã chỉ ra, bạn sẽ không mất bất cứ thứ gì. – Mat

0

Chỉ cần một mẹo nhỏ sẽ làm:

Thay thế:

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

Với:

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

Đó là sạch hơn so với đi qua và sau đó đọc kết quả như thế này:

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

Khi trong C++, hãy sử dụng các tài liệu tham khảo của họ :) Trong C bạn sẽ thay đổi chữ ký chức năng để:

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

và nhớ sửa số t ở những nơi có liên quan.

Vâng, C++ rõ ràng sạch :) là