递归仅在断点或getchar时生效,随机二叉树生成函数异常求助
嘿,我看到你遇到的问题了——不管指定多少节点,生成随机二叉树的代码只执行一次就退出,这大概率是代码里的几个关键问题导致的,咱们一步步来捋清楚:
问题1:循环内重复调用srand()是大坑
你在for循环里每次都调用srand((unsigned int)time(NULL)),但time(NULL)返回的是秒级的时间戳,循环执行速度远快于1秒,所以每次循环的随机数种子都是完全相同的,生成的randomNumber也一模一样。如果你的插入逻辑是避免重复值的,那第一次插入后,后面的插入都会失败,看起来就像代码只执行了一次。
正确的做法是:只在程序启动时调用一次srand(),比如放在main函数的开头,而不是循环里。
问题2:插入逻辑不完整(从你的代码片段来看)
你的代码写到i...就断了,推测你可能没正确实现二叉树的插入逻辑——比如没有创建新的Node节点,或者没有根据节点值判断插入左/右子树,导致每次循环都没有实际添加新节点,自然看起来只执行了一次。
修正后的完整代码示例
我给你写了一个可运行的完整版本,包含正确的随机数生成、二叉树插入和遍历验证:
#include <stdio.h> #include <stdlib.h> #include <time.h> // 定义二叉树节点结构 struct Node { int number; struct Node* left; struct Node* right; }; // 创建新节点并初始化 struct Node* createNode(int num) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->number = num; newNode->left = NULL; newNode->right = NULL; return newNode; } // 二叉搜索树插入逻辑(小于当前节点插左,大于等于插右) void insert(struct Node** node, int num) { if (*node == NULL) { *node = createNode(num); return; } if (num < (*node)->number) { insert(&((*node)->left), num); } else { insert(&((*node)->right), num); } } // 中序遍历验证树结构(二叉搜索树的中序遍历是有序的) void inorderTraversal(struct Node* node) { if (node == NULL) return; inorderTraversal(node->left); printf("%d ", node->number); inorderTraversal(node->right); } // 递归释放二叉树内存,避免内存泄漏 void destroyTree(struct Node* node) { if (node == NULL) return; destroyTree(node->left); destroyTree(node->right); free(node); } int main() { // 只初始化一次随机数种子! srand((unsigned int)time(NULL)); struct Node* root = NULL; int numberOfNodes = 10; // 可以修改这个值测试不同节点数 for (int i = 0; i < numberOfNodes; i++) { int randomNumber = rand() % 36; // 生成0-35的随机数 insert(&root, randomNumber); } printf("生成的二叉树中序遍历结果(有序则说明插入正常):\n"); inorderTraversal(root); printf("\n"); // 记得释放内存 destroyTree(root); return 0; }
额外提醒
- 如果不想生成重复值,可以在插入前先写一个查找函数,检查树中是否已有该值,只有不存在时才插入。
- 二叉树的插入逻辑可以根据需求调整(比如不是二叉搜索树,而是随机选择左/右子树插入),如果需要随机位置插入,只需修改
insert函数的判断逻辑即可,比如用rand() % 2来决定插左还是右。
内容的提问来源于stack exchange,提问作者Shaiduck
相关产品推荐
相关产品推荐

