二叉树前序转后序代码报错未声明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
相关产品推荐
相关产品推荐

