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

二叉树前序转后序代码报错未声明left/right变量,实际已声明的问题

问题原因与修复方案

核心问题:while语句语法错误导致变量声明无法被正确解析

你的代码中while (middle[pos++] != ch)这一行既没有循环体(无分号或大括号),后续的变量声明被编译器误认为是while循环的一部分,而C语言语法不允许在无大括号包裹的循环体中直接放置变量声明,最终导致编译器无法识别left和right的声明,抛出未定义错误。

同时这段代码还有其他逻辑问题,以下是完整修复方案:

修复后的完整代码

#include <stdio.h>
#include <string.h>

void traverBitree(char *first, char *middle);
int index = 0;

int main(void)
{
    char first[27], middle[27]; 
    // 替换已废弃的gets,避免缓冲区溢出风险
    fgets(first, sizeof(first), stdin);
    fgets(middle, sizeof(middle), stdin);
    // 去除fgets读取的换行符
    first[strcspn(first, "\n")] = '\0';
    middle[strcspn(middle, "\n")] = '\0';
    traverBitree(first, middle);
    printf("\n");
}

void traverBitree(char *first, char *middle)
{
    int len = strlen(middle);
    if (len == 0)
        return;                 
    char ch = first[index++];   
    int pos = 0;                
    // 修正while循环:添加空循环体与边界判断
    while (pos < len && middle[pos] != ch) 
        pos++;
    // 分割左子树中序序列
    char left[26], right[26];
    strncpy(left, middle, pos);
    left[pos] = '\0'; // strncpy不会自动添加终止符,手动补全
    // 分割右子树中序序列
    strcpy(right, middle + pos + 1);
    traverBitree(first, left);  
    traverBitree(first, right);
    printf("%c", ch);     
}

关键修正点说明

  • 修复while语法错误:给while循环添加空循环体(;),同时增加pos < len的边界判断,避免数组越界。
  • 修正字符串分割逻辑:
    • 手动为left添加字符串终止符'\0',因为strncpy不会自动补全,防止后续操作出现乱码。
    • 右子树的中序序列从pos+1开始,因为pos是根节点在中序序列中的索引位置。
  • 替换不安全的gets函数:gets存在严重缓冲区溢出风险,改用fgets读取输入并处理换行符。

内容的提问来源于stack exchange,提问作者Grey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:46:14