递归遍历字典trie以计算总字数

时间:2017-04-07 23:49:41

标签: c++ trie

我已经从链表中建立了一个特里。每个节点包含一个char和一个包含27个节点的数组(字母表中的字母+ $表示单词结尾的额外位置)。 我尝试编写一个递归方法来计算单词的数量,但它返回1.我不确定如何解决它或确切的错误。

int recursiveCount(Node* temp, int count)
{
    if (temp->value == '$')
    {
        count++;
    }
    for (int i = 0; i < 27; i++)
    {
        if (temp->array[i] != NULL)
        {
            return recursiveCount(temp->arr[i],count);
        }
    }
return count;
}

3 个答案:

答案 0 :(得分:0)

您通过值传递count,这意味着当递归解除时,它会超出范围,并且只有最远的一个&#34; out返回,因为我是第一个count增加它只是1.通过引用而不是int recursiveCount(Node* temp, int& temp);

答案 1 :(得分:0)

正如其他答案中已经提到的,您的问题是您拥有不同的count变量,每个递归调用一个变量。增加一个不会改变其他人。除了传递(非常量)引用之外,您还可以使用更多函数式编程方法并从函数中返回计数。当然,您需要总结您所做的所有递归调用的返回计数:

unsigned recursiveCount(Node const * node) /* you don't change the node, so make
                                              it const. Why a pointer btw? A
                                              reference would do fine! */
{
    unsigned count = 0; /* You aren't expecting a negative number of
                           words, are you? So use unsigned. */
    if (node->value == '$')
    {
        count++;
    }
    for (int i = 0; i < 27; i++)
    {
        if (node->array[i] != NULL) /* "array"!? change that to a meaningful
                                       name ... "children" is bad, but not as
                                       bad as "array" ... */
        {
            count += recursiveCount(node->array[i]); /* "arr" was a typo I
                                                        suppose */
        }
    }
    return count; /* consistent indentation, please! */
}

答案 2 :(得分:0)

您已将此标记为C ++,因此我很困惑为什么该方法不是Node的一部分。见封装。

递归代码中的重大错误不是添加在每个后续节点中找到的每个'$'。特别是,您的代码只返回for循环的一次调用计数,所有其他循环都被丢弃。

for (int i = 0; i < 27; i++)
{
    if (temp->array[i] != NULL)
    {
        return recursiveCount(temp->arr[i],count);
        // This only returns one value,
        // and ignores all the other 26 possible values
        // these should sum together
    }
}

考虑将方法作为节点的一部分。请注意retVal如何累积每个'$'。

int Node::recursiveCount()
{
    int retVal = 0; // accumulation

    if (value == '$') 
    { 
        retVal += 1;  // 1 word found here
    }

    // keep searching here, there might still be words with prefix
    for (size_t i = 0; i < 27; i++)
    {
        if (nullptr != nxt[i]) 
        {
            retVal += (nxt[i]->recursiveCount());
            //     ^^ accumulate any other words found
        }
    }
    return (retVal); // return full count
}