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

二叉搜索树转数组时索引值异常问题求助

问题分析

你的代码存在两个核心问题:

  1. 函数名不一致:定义的函数是treeToArr,但递归调用时写的是storeInArray,这会导致编译错误,需先统一函数名。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:45:32