COUNT BST子树,直到找到特定的给定键(inorder遍历)

时间:2017-06-28 19:27:11

标签: c recursion count binary-search-tree inorder

家庭作业

我需要计算我经历了多少子树(按顺序),直到找到给定的键,

例如:如果我有一棵树,& inorder 遍历是:1,3,7,8,9,10,11,15,20 给定键时:9,我需要返回5,当给定键时:3,我需要返回2。 我一直在互联网上试图找到一些帮助&找不到。

到目前为止我得到的是:

(“FUNC”是一个比较整数或其他的特定函数,它有效)

    void PRINT_KEY_ORDER(PTN TRoot, void *nkey, CMP_KEYS FUNC)  // prints keys place (inorder)
{
    int counter = 1;
    fprintf(stdout, "%d", *(COUNT_INORDER(TRoot, nkey, FUNC, &counter)));   // prints counter which is always INT
}

int* COUNT_INORDER(PTN TRoot, void *nkey, CMP_KEYS FUNC, int *counter)      // counts times until reaches wanted key
{
    if (TRoot != NULL)
    {
        COUNT_INORDER(TRoot->left, nkey, FUNC, counter);
        if (FUNC(TRoot->key, nkey) == 0)
            return counter;
        (*counter)++;
        COUNT_INORDER(TRoot->right, nkey, FUNC, counter);
    }
}

此代码有效。

正确计算,但由于某些原因,如果我使用超过这些内容,则会在fprintf行崩溃:9 3 1 7 8 20

1 个答案:

答案 0 :(得分:0)

不确定这是否正确。尝试按顺序进行并增加静态变量的计数。找到密钥后,将其作为返回变量,否则默认返回值为-1,表示未找到密钥。

int COUNT_INORDER(PTN TRoot, nkey, FUNC )     
   {
    static count=0;
    int ret=-1;

    ret= COUNT_INORDER(TRoot->left, nkey, FUNC);

    count++;
    if (FUNC(TRoot->key, nkey) == 0)
        ret = count;

    if(ret == -1)
        ret= COUNT_INORDER(TRoot->right, nkey, FUNC);


     return ret;
    }