递归仅在使用断点或getchar

时间:2018-04-12 04:01:51

标签: c recursion binary-tree

我一直在尝试实现一个自动生成随机二叉树的函数,具体取决于作为参数接收的节点数。每当我运行我的代码时,无论我指定的节点数量是多少,它都会执行一次并且正常退出。 这是我的代码:

struct Node
{
    int number;
    struct Node* left;
    struct Node* right;
};

void insert(Node** node, int numberOfNodes)
{
    for (int i = 0; i < numberOfNodes; i++)
    {
        srand((unsigned int)time(NULL));
        int randomNumber = rand() % 36;
        if (!insertNumber(node, randomNumber))
        {
            i--;
        }
        //getchar();
        //If I don't use this getchar() 
        //or execute with breakpoints, it only inserts one node.
    }
}

bool insertNumber(Node** node, int number)
{
    Node* newNode = NULL;
    if (*node == NULL)
    {
        newNode = (Node*)malloc(sizeof(Node));
        newNode->left = NULL;
        newNode->right = NULL;
        newNode->number = number;
        *node = newNode;
        return true;
    }
    else if (number < (*node)->number)
    {
        insertNumber(&(*node)->left, number);
        return true;
    }
    else if (number > (*node)->number)
    {
        insertNumber(&(*node)->right, number);
        return true;
    }
    return false;
    //if equal, do not insert
}

这是主要功能:

int main(int argc, const char * argv[])
{
    Node* root = NULL;

    int numberOfNodes = 10;

    printf("Starting test\n");

    insert(&root, numberOfNodes);

    printAllLevels(root);

    printf("program finished\n");
}

因此程序在递归之前完成,并且只显示一个节点。我尝试使用sleep(),但它根本没用。

你能帮我弄清楚我的代码丢失了吗?

感谢。

1 个答案:

答案 0 :(得分:3)

而不是

insertNumber(&(*node)->left, number);
return true;

您应该return insertNumber(&(*node)->left, number);

请注意,由于此错误,即使您没有向树中添加节点,也会返回true。因此,您的支票

if (!insertNumber(node, randomNumber))
{
    i--;
}

不会递减i并且你的循环继续认为它添加了节点。

接下来,您的srand应该只在循环外发生一次。因为time(NULL)返回自1970年1月1日以来经过的秒数,所以你的代码会一遍又一遍地为随机数生成器播放相同的值(直到下一秒过去......这种情况很少发生在那里环)。因此,您的代码会尝试一遍又一遍地向树中添加相同的数字。此错误与您之前的错误相结合,可以提供您观察到的行为。

当您使用getchar添加断点或暂停用户输入时,您会导致时间延迟,如果延迟足够长,则随机数生成器将获得不同的值,并且新节点可能是添加到树上。