如何实现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
相关产品推荐
相关产品推荐

