LeetCode二叉树中序遍历C语言代码自测通过提交报错求排查
问题根因
你提交报错的核心原因是使用了全局变量存储遍历结果和计数:
- LeetCode后台验证时会连续调用多次
inorderTraversal函数执行不同测试用例,全局变量arr、size的生命周期和整个程序一致,不会在每次函数调用时自动重置。第一个测试用例执行完成后,size已经被赋值为第一个用例的节点数,arr也还持有上一次申请的内存地址,后续测试用例会在上一次的结果基础上追加数据,自然返回错误结果。 - 本地单次运行测试用例时,全局变量初始值就是
NULL和0,所以不会触发问题,这也是你本地测试通过但提交失败的原因。 - 额外隐患:全局内存没有释放逻辑,多次调用会产生内存泄漏,
realloc未做失败校验,极端场景下会触发空指针解引用崩溃。
修复方案
快速适配现有代码
仅需在入口函数开头重置全局变量状态即可解决提交报错问题:
int *arr=NULL; int size=0; void inorder (struct TreeNode *root) { if(root) { inorder(root->left); arr=(int *)realloc(arr,sizeof(int)*(++size)); arr[size-1]=root->val; inorder(root->right); } } int* inorderTraversal (struct TreeNode* root, int* returnSize) { // 新增重置逻辑,保证每次调用都是全新上下文 size = 0; free(arr); arr = NULL; inorder(root); *returnSize = size; return arr; }
更规范的实现(推荐)
去掉全局变量,通过参数传递遍历上下文,避免全局变量带来的各种潜在冲突:
void inorder(struct TreeNode* root, int** resArr, int* curSize) { if (root == NULL) { return; } inorder(root->left, resArr, curSize); *resArr = realloc(*resArr, sizeof(int) * ((*curSize) + 1)); (*resArr)[(*curSize)++] = root->val; inorder(root->right, resArr, curSize); } int* inorderTraversal(struct TreeNode* root, int* returnSize) { *returnSize = 0; int* res = NULL; inorder(root, &res, returnSize); return res; }
内容的提问来源于stack exchange,提问作者Uday Kiran
相关产品推荐
相关产品推荐

