You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:36:01