二叉搜索树转数组时索引值异常问题求助
问题分析
你的代码存在两个核心问题:
- 函数名不一致:定义的函数是
treeToArr,但递归调用时写的是storeInArray,这会导致编译错误,需先统一函数名。 - C语言参数传递为值传递:你传入的
index是值的副本,递归函数内部对index的修改仅在当前函数栈生效,不会影响外层调用的index值。比如左子树递归时修改了index,但回到根节点的函数上下文时,index还是最初传入的值,这直接导致了索引跳变的异常。
修复方案
方案1:通过指针传递索引
将index改为指针类型,让递归内部的修改直接作用于原变量:
void treeToArr(Node *root, int *ptr, int *index) { if (root == NULL) { return; } treeToArr(root->left, ptr, index); ptr[(*index)++] = root->value; treeToArr(root->right, ptr, index); }
调用时需传入索引变量的地址:
int arr[100]; // 确保数组大小足够容纳所有节点值 int index = 0; treeToArr(root, arr, &index);
方案2:让函数返回更新后的索引
函数递归结束后返回当前的索引值,外层调用用返回值更新index:
int treeToArr(Node *root, int *ptr, int index) { if (root == NULL) { return index; } // 先遍历左子树,更新索引 index = treeToArr(root->left, ptr, index); // 存储当前节点值,索引自增 ptr[index++] = root->value; // 遍历右子树,继续更新索引 index = treeToArr(root->right, ptr, index); return index; }
调用时接收返回值:
int arr[100]; int index = 0; index = treeToArr(root, arr, index);
逻辑说明
这两种方案都能保证BST中序遍历(升序输出)时索引持续递增:左子树遍历完成后,索引指向左子树最后一个元素的下一位,存储根节点后索引自增,再将更新后的索引传入右子树,最终数组会按升序依次填充所有节点值。
内容的提问来源于stack exchange,提问作者compsci3289294
相关产品推荐
相关产品推荐

