C语言实现中序遍历将节点数据存入int数组出现异常问题
问题根本原因
你代码的问题出在index参数的传递方式错误:C语言默认函数参数为值传递,你传入inorder函数的index是值拷贝,每个递归调用栈里的index都是独立的副本,当前调用内执行的index++只会修改当前栈的副本,不会同步更新父调用的index值,更不会同步到main函数里的初始index变量。
你运行输出的下标日志已经能验证这个问题:下标0出现了2次、下标1出现了2次,多个节点会往同一个数组位置写数据,前一个写入的值会被后一个覆盖,最终只有下标0、1、2三个位置被写入了数据,剩下的下标3、4没有被赋值,保留了栈上局部数组未初始化的随机垃圾值,就是你看到的异常负数。
修复方案
推荐使用指针传递的方案,让所有递归调用共用同一个索引变量:
- 修改inorder函数的定义,把第三个参数改为int指针类型:
void inorder(Node* N, int* nodeDataList, int* index){ if(N != NULL){ inorder(N->left, nodeDataList, index); printf("%d: %d ", *index, N->data); nodeDataList[(*index)++] = N->data; inorder(N->right, nodeDataList, index); } }
- 调用inorder时传入index变量的地址即可:
inorder(N, nodeDataList, &index);
如果只是单次调试使用,也可以把index设为函数内的静态变量,不过这种方案不支持多线程场景、也不支持多次调用遍历,通用性不如指针传递方案。
内容的提问来源于stack exchange,提问作者Kevin Lu
相关产品推荐
相关产品推荐

