引自免费微信小程序:皆我百晓生
首先,让我们解决代码中的警告和错误。
- ISO C++ forbids converting a string constant to 'char'* 这个警告是因为你在传递字符串常量给需要
char*类型的函数时没有正确地转换。例如,在创建二叉树时,你应该使用strdup()函数复制字符串常量,然后释放内存。修改后的代码如下:
char *input = strdup(ch);
free(input);
- built-in function 'index' declared as non-function 这个警告是由于变量名与内置函数名冲突。将变量名更改为不与C++标准库中的任何函数名冲突的名字,比如
current_index。
接下来,我们来修复代码中的逻辑错误。在switch语句中,当用户选择创建二叉树(case 1)之后,你需要跳出当前的switch语句,否则会立即执行后续的预序遍历、中序遍历和后序遍历。这可以通过添加break语句来实现:
switch(k){
case 1:
BiTree Tree;
CreateBiTree(&Tree);
break; // 添加这个break语句
case 2:
PreOrder(Tree);
case 3:
InOrder(Tree);
case 4:
PostOrder(Tree);
}
对于EnterQueue函数,存在一个语法错误,条件判断语句写法不正确。修正为:
if((Q->rear + 1) % maxsize == Q->front){
return(0);
}
现在,代码应该可以正常编译并运行,但是为了确保二叉树的正确构建,我们需要修复CreateBiTree函数。当前版本的函数在遇到第一个非 '@' 字符时就会停止处理,我们需要将其改为递归处理整个输入字符串。以下是修改后的CreateBiTree函数:
void CreateBiTree(BiTree *bt){
if(strlen(ch) == 0 || ch[index] == '\0'){
return ;
}
if(ch[index] == '@'){
*bt = NULL;
index++;
} else{
*bt = (BiTree)malloc(sizeof(BiTNode));
(*bt)->data = ch[index];
index++;
(*bt)->LChild = NULL;
(*bt)->RChild = NULL;
printf("left\n");
CreateBiTree(&(*bt)->LChild);
printf("right\n");
CreateBiTree(&(*bt)->RChild);
}
}
现在,当你运行程序并选择1来创建二叉树,程序将会根据给定的输入字符串构建二叉树,并且不会出现未定义的行为。注意,这个代码示例并没有包含所有选项的功能,如队列操作、打印等。如果你想要实现这些功能,你需要补充相应的函数和主函数中的调用。此外,记得在使用完动态分配的内存后释放它们,以防止内存泄漏。

