递归仅在使用断点或 getchar 时有效
Recursion only works when using breakpoints or getchar
我一直在尝试实现一个函数,该函数将根据作为参数接收的节点数自动生成随机二叉树。每当我 运行 我的代码时,它都会执行一次并正常退出,无论我指定的节点数是多少。
这是我的代码:
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(),但它根本没有帮助。
你能帮我弄清楚我的代码缺少什么吗?
谢谢。
而不是
insertNumber(&(*node)->left, number);
return true;
你应该return insertNumber(&(*node)->left, number);
请注意,由于这个错误,即使您没有向树中添加节点,您也会返回 true
。因此,您的支票
if (!insertNumber(node, randomNumber))
{
i--;
}
不递减 i
并且您的循环继续认为它添加了节点。
接下来你的 srand
应该只发生一次,在循环之外。因为 time(NULL)
returns 自 1970 年 1 月 1 日以来经过的秒数,您的代码一遍又一遍地为随机数生成器播种相同的值(直到下一秒过去......这是罕见的发生在那个紧密的循环中)。因此,您的代码会尝试将相同的数字一遍又一遍地添加到树中。这个错误,结合你之前的错误给出了你观察到的行为。
当您使用 getchar
添加断点或暂停用户输入时,您会导致时间延迟,如果延迟足够长,随机数生成器将使用不同的值和新节点进行播种可以添加到树中。
我一直在尝试实现一个函数,该函数将根据作为参数接收的节点数自动生成随机二叉树。每当我 运行 我的代码时,它都会执行一次并正常退出,无论我指定的节点数是多少。 这是我的代码:
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(),但它根本没有帮助。
你能帮我弄清楚我的代码缺少什么吗?
谢谢。
而不是
insertNumber(&(*node)->left, number);
return true;
你应该return insertNumber(&(*node)->left, number);
请注意,由于这个错误,即使您没有向树中添加节点,您也会返回 true
。因此,您的支票
if (!insertNumber(node, randomNumber))
{
i--;
}
不递减 i
并且您的循环继续认为它添加了节点。
接下来你的 srand
应该只发生一次,在循环之外。因为 time(NULL)
returns 自 1970 年 1 月 1 日以来经过的秒数,您的代码一遍又一遍地为随机数生成器播种相同的值(直到下一秒过去......这是罕见的发生在那个紧密的循环中)。因此,您的代码会尝试将相同的数字一遍又一遍地添加到树中。这个错误,结合你之前的错误给出了你观察到的行为。
当您使用 getchar
添加断点或暂停用户输入时,您会导致时间延迟,如果延迟足够长,随机数生成器将使用不同的值和新节点进行播种可以添加到树中。