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

如何实现AVL树的中序遍历并将节点值存入数组?

解决AVL树中序遍历填充数组的递归问题

我一眼就发现你代码里的核心问题了——y参数是按值传递的!在C语言里,当你把y作为参数传给递归函数时,函数拿到的只是它的副本,你在函数里做y++只会修改这个副本,上层递归的y根本不会跟着变。这就导致数组的索引一直没法正确递增,要么重复覆盖同一个位置,要么后面的元素根本填不进去。

给你两种简单的修改方案,任选其一就行:

方案1:用指针传递y

把y改成指针类型,这样所有递归调用操作的都是同一个内存地址里的数值,索引就能正确递增了:

// 调用时node为AVL树的根节点,x为数组长度,y初始值为0(传入&y),array为要填充的数组
void inorder(int* array, Tree_Node* node, int x, int* y) {
    if (!node || *y >= x) { // 提前判断索引是否超出,避免数组越界
        return;
    }
    inorder(array, node->getLeft(), x, y);
    if (*y < x) { // 再次检查,防止左子树递归后已经填满数组
        array[*y] = GET_ID(node->getkey());
        (*y)++; // 注意括号,先解引用再自增
    }
    inorder(array, node->getRight(), x, y);
}

调用的时候要传&y(比如int y = 0; inorder(arr, root, len, &y);),这样所有递归层都能共享同一个索引值。

方案2:让函数返回更新后的y值

另一种思路是让递归函数返回当前填充到的索引位置,上层函数用这个返回值继续操作:

// 调用时node为AVL树的根节点,x为数组长度,y初始值为0,array为要填充的数组
int inorder(int* array, Tree_Node* node, int x, int y) {
    if (!node || y >= x) {
        return y; // 返回当前索引,不做任何操作
    }
    // 先遍历左子树,拿到更新后的索引
    y = inorder(array, node->getLeft(), x, y);
    if (y < x) {
        array[y] = GET_ID(node->getkey());
        y++;
    }
    // 再遍历右子树,继续更新索引
    y = inorder(array, node->getRight(), x, y);
    return y; // 返回最终的索引位置
}

调用的时候直接接收返回值就行(比如int y = inorder(arr, root, len, 0);),这种方式不需要指针,逻辑也很清晰。

两种方案都能解决你的问题,核心都是让递归过程中索引的变化能在各个递归层之间传递。另外我还加了索引越界的判断,这也是个很重要的细节哦!

内容的提问来源于stack exchange,提问作者jena90

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:58:42