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

C语言有序一维数组转二叉搜索树:代码无法得到预期输出

有序数组转二叉搜索树的代码修复

你的代码问题出在递归创建左右子树的步骤——调用BST()后没有把返回的子树根节点赋值给当前节点的left和right指针,导致左右子树根本没挂到当前节点上,最终生成的树只有根节点,没有子节点。

修复后的完整代码

#include <stdio.h>
#include <stdlib.h>

int arr[7] = {-10,-3,-1,0,3,7,9};

typedef struct tree{
   int data;
   struct tree *left;
   struct tree *right;
}bst;

struct tree *CreateNode(int data){
   bst *node = (bst*)malloc(sizeof(bst));
   node->data = data;
   node->left = NULL;
   node->right = NULL;
   return node;
}

struct tree *BST(bst *root,int start,int end){
    if(start>end){
        return NULL;
    }
    int mid = start + (end-start)/2;
    root = CreateNode(arr[mid]);
    // 关键修改:将递归返回的子树节点赋值给当前节点的left和right
    root->left = BST(root->left,start,mid-1);
    root->right = BST(root->right,mid+1,end);
    return root;
 }

// 中序遍历验证结果
void inorderTraversal(bst *root) {
    if (root == NULL) return;
    inorderTraversal(root->left);
    printf("%d ", root->data);
    inorderTraversal(root->right);
}

int main() {
    bst *root = BST(NULL, 0, 6);
    printf("中序遍历结果:");
    inorderTraversal(root);
    return 0;
}

关键修改说明

原来的代码只是调用了BST(root->left, start, mid-1),但没有把这个函数返回的子树根节点赋值给root->left,同理right也是如此。修复后,递归生成的左右子树会正确挂载到当前节点的对应指针上,这样才能构建出完整的平衡二叉搜索树。

运行修复后的代码,中序遍历会输出和原数组一致的有序序列:-10 -3 -1 0 3 7 9,符合二叉搜索树的特性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:18:18