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

在C语言实现二叉搜索树时,是否需重新赋值根节点?

你的二叉搜索树无输出问题分析与修复方案

你猜的完全没错!程序无输出的核心原因就是根节点指针始终没被正确赋值——你的insert函数采用了值传递的方式接收节点指针,函数内部对指针的修改根本不会影响到main里的root变量。

问题拆解

  1. 指针传递的坑:当你第一次调用insert(root, 45)时,root是NULL,函数里执行A = (Node*)malloc(sizeof(Node))只是修改了函数内部的局部变量A,main中的root依然是NULL。后续所有插入操作都在操作空指针,最终inorder遍历的还是空树,自然没有输出。
  2. 二叉搜索树逻辑错误:在插入值小于当前节点值的分支里,你错误地写了insert(A->right, value),应该是A->left,这会导致所有较小的值都被插到右子树,完全违背了二叉搜索树的规则。

修复方案

这里提供两种常用的修复方式:

方式1:让insert函数返回新的节点指针

修改insert的返回类型为Node*,每次插入后返回更新后的节点指针,这样main里可以直接用返回值更新root:

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

typedef struct node {
    int data;
    struct node *left, *right;
}Node;

void addToNode(Node *A, int value) {
    A->data=value;
    A->left=NULL;
    A->right=NULL;
}

Node* insert(Node *A, int value) {
    if(A==NULL) {
        A = (Node*)malloc(sizeof(Node));
        addToNode(A, value);
        return A;
    } else {
        if(value>A->data) {
            A->right = insert(A->right, value);
        } else if(value<A->data) {
            // 修复left/right的错误
            A->left = insert(A->left, value);
        }
        return A;
    }
}

void inorder(Node *root) {
    if (root != NULL) {
        inorder(root->left);
        printf("%d \n", root->data);
        inorder(root->right);
    }
}

int main() {
    Node *root = NULL;
    int A[]={45,32,56,23,11,89};
    for(int i=0; i<6; i++)
        // 用返回值更新root指针
        root = insert(root,A[i]);
    inorder(root);
}

方式2:使用二级指针传递

通过传递指针的指针,让函数可以直接修改外部的指针变量:

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

typedef struct node {
    int data;
    struct node *left, *right;
}Node;

void addToNode(Node *A, int value) {
    A->data=value;
    A->left=NULL;
    A->right=NULL;
}

void insert(Node **A, int value) {
    if(*A==NULL) {
        *A = (Node*)malloc(sizeof(Node));
        addToNode(*A, value);
        return;
    } else {
        if(value>(*A)->data) {
            insert(&(*A)->right, value);
        } else if(value<(*A)->data) {
            // 修复left/right的错误
            insert(&(*A)->left, value);
        }
    }
}

void inorder(Node *root) {
    if (root != NULL) {
        inorder(root->left);
        printf("%d \n", root->data);
        inorder(root->right);
    }
}

int main() {
    Node *root = NULL;
    int A[]={45,32,56,23,11,89};
    for(int i=0; i<6; i++)
        // 传递root的地址
        insert(&root,A[i]);
    inorder(root);
}

测试结果

修复后运行程序,会输出二叉搜索树的中序遍历结果(升序):

11 
23 
32 
45 
56 
89 

内容的提问来源于stack exchange,提问作者Aditya Vinod Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:23:17