【问题标题】:Ternary Search Tree三元搜索树
【发布时间】:2014-11-28 05:22:45
【问题描述】:
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) 段,但树没有形成,即节点没有链接。

【问题讨论】:

    标签: c++ tree ternary-tree ternary-search-tree


    【解决方案1】:
    t=temp;
    

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

    您可以更改您的函数以返回 Ternary*(在这种情况下,在其末尾返回 t),并将调用站点更改为:

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

    【讨论】:

    • 或将参数声明为 add(Ternary** t, string s, int i) 然后执行 *t = temp
    • 没有使用 temp,我还尝试了以下语句 t=new Ternary(s[i]);如果我使用 tree = ... 那么我将失去树的根节点
    • @Pratik:除了将return t; 放在add() 的末尾并使用add 如我所指出的那样,您不会丢失任何东西。
    【解决方案2】:

    一个小技巧就可以了:

    替换:

    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++ 显然更干净 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多