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

C语言实现二叉搜索树插入后打印根节点左右子节点触发段错误的原因?

二叉搜索树插入操作段错误的成因分析

核心问题本质

你的代码触发段错误的直接原因是:新插入的节点从未被正确挂载到二叉搜索树的结构中,导致root->left和root->right始终为NULL。当你尝试访问root->left->data或root->right->data时,实际上是对空指针进行解引用,这直接触发了内存访问错误(段错误)。

代码中的具体错误拆解

  1. 循环比较对象错误
    在insert函数的while循环里,你始终用root->data作为比较基准,而非当前遍历到的temp节点的data。比如插入值4时,虽然逻辑上会走向左子树,但插入后续节点时,这个错误的比较会导致遍历路径完全不符合二叉搜索树的规则,更关键的是——

  2. 未完成节点挂载的关键步骤
    当while循环结束时,temp已经变成NULL,此时你执行temp = newNode只是修改了局部变量temp的指向,并没有修改树中父节点的left或right指针。也就是说,根节点root的左右子节点指针始终保持初始的NULL状态,新节点完全游离于树结构之外。

修正后的插入函数示例

#include <stdio.h>
#include <stdlib.h>
struct node {
    int data;
    struct node* left;
    struct node* right;
};

struct node *root = NULL; // 移除全局temp,改用局部变量更安全

void insert(int data) {
    struct node *newNode = (struct node*) malloc(sizeof(struct node));
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    
    if (root == NULL){
        root = newNode;
    }else {
        struct node *temp = root;
        struct node *parent = NULL; // 记录遍历路径中的父节点
        while(temp != NULL) {
            parent = temp;
            if(data <= temp->data) {
                temp = temp->left;
            } else {
                temp = temp->right;
            }
        }
        // 将新节点挂载到父节点的对应位置
        if(data <= parent->data) {
            parent->left = newNode;
        } else {
            parent->right = newNode;
        }
    }
}
int main() {
    insert(7);
    insert(4);
    insert(8);
    printf("\n\n------%d------", root->left->data);
    printf("\n\n------%d------", root->right->data);
    return 0;
}

修正点说明

  • 移除全局temp变量,改用局部变量避免意外的全局状态污染
  • 新增parent变量跟踪当前节点的父节点,确保能找到挂载新节点的位置
  • 循环中使用当前temp节点的data进行比较,符合二叉搜索树的遍历规则
  • 循环结束后通过父节点的left/right指针将新节点真正挂载到树上,而非仅修改临时变量的指向

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:06:17