【问题标题】:Recursion only works when using breakpoints or getchar递归仅在使用断点或 getchar 时有效
【发布时间】:2018-09-22 02:10:18
【问题描述】:

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

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(),但它根本没有帮助。

你能帮我弄清楚我的代码缺少什么吗?

谢谢。

【问题讨论】:

    标签: c recursion binary-tree


    【解决方案1】:

    代替

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

    你应该有return insertNumber(&amp;(*node)-&gt;left, number);

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

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

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

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

    当您使用getchar 添加断点或暂停用户输入时,您会导致时间延迟,如果延迟足够长,随机数生成器将使用不同的值作为种子,并且可能会添加一个新节点树。

    【讨论】:

    • “接下来你的 srand 应该只发生一次,在循环之外”在main()。 (insert 可以多次调用以更改随机种子
    • 非常感谢@MFisherKDX!这次它确实有效。我处理这个问题已经有一段时间了,但没有抓住它,我还有很多东西要学。
    • @DavidC.Rankin 正如你所说,它可以被多次调用,但对于第一个练习,只需要一次就足够了。我仍然会考虑到,如果我想多次运行它, srand() 的当前位置可以工作。谢谢。
    • @Shaiduck 更重要的是,如果您想多次运行它,srand() 的当前位置可能会失败。你真的应该把它移到main()
    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多