在C语言中如何将前序遍历的AVL树键值与高度存入数组?
解决AVL树测试中数组存储格式问题
首先看你的问题:虽然preOrder函数能正确输出节点的key和height(输出10,2,5,1,15,1,),但print_pre_order没有把这些值正确存入test_output数组,导致测试断言失败。我们需要修复print_pre_order函数,让它按照前序遍历的顺序,把每个节点的key和height依次写入数组。
问题分析
你的preOrder逻辑是完全正确的:先输出当前节点的key,再输出height,然后递归遍历左子树、右子树。但print_pre_order需要复刻这个逻辑,把打印操作替换为往数组存值的操作,同时要维护好当前数组的索引位置,确保每个值都存在正确的位置上。
修复后的print_pre_order实现
int print_pre_order(struct Node* root, int* output_array, int current_index) { if (root == NULL) { // 空节点,直接返回当前索引,不修改数组 return current_index; } // 先存入当前节点的key output_array[current_index++] = root->key; // 再存入当前节点的height output_array[current_index++] = root->height; // 递归处理左子树,更新索引 current_index = print_pre_order(root->link[0], output_array, current_index); // 递归处理右子树,更新索引 current_index = print_pre_order(root->link[1], output_array, current_index); // 返回更新后的索引,供上层调用使用 return current_index; }
为什么这样能解决问题?
- 这个函数和
preOrder的遍历逻辑完全对齐:先处理当前节点,再左子树,最后右子树 - 每次处理节点时,严格按照“key在前,height在后”的顺序存入数组,完全匹配你期望的格式
- 通过返回更新后的索引,确保递归过程中数组的位置不会错乱,每个值都能被放到正确的位置上
测试验证
修复后,test_output数组会被填充为{10,2,5,1,15,1},和correct_output完全匹配,测试就会显示PASSED了。另外注意你的correct_output末尾多了个逗号,不过这个在C语言数组初始化里不影响编译,只是写法上可以去掉更规范。
内容的提问来源于stack exchange,提问作者Zsolti
相关产品推荐
相关产品推荐

