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

二叉搜索树中序打印函数触发读取访问冲突异常排查

解决二叉树中序遍历的读取访问冲突问题

首先可以确定:你的print_bst_node函数缺少了空指针检查,这是触发"read access violation"异常的直接原因。

当遍历到二叉树的叶子节点时,它的left或right指针是NULL;如果树本身是空树(root为NULL),直接访问root->left相当于访问无效内存地址,必然会触发读取权限冲突。

修正后的中序遍历函数

你需要给遍历函数加上空节点的判断逻辑,一旦当前节点为NULL就直接返回,避免非法内存访问:

void print_bst_node(bstNode* root) {
    // 先检查当前节点是否为空,为空则终止递归
    if (root == NULL) {
        return;
    }
    // 中序遍历标准流程:左子树 -> 当前节点 -> 右子树
    print_bst_node(root->left);
    printf("%ld ", root->data); // 打印当前节点的数据
    print_bst_node(root->right);
}

额外排查点:插入函数的节点初始化

另外还要确认你的insert_bst函数是否正确初始化了新节点的left和right指针为NULL。如果插入时没有设置这两个指针,它们会是随机的野指针,遍历的时候同样会触发访问冲突。正确的插入逻辑应该包含:

bstNode* insert_bst(bstNode* root, long value) {
    if (root == NULL) {
        // 创建新节点时必须初始化左右指针
        bstNode* new_node = (bstNode*)malloc(sizeof(bstNode));
        new_node->data = value;
        new_node->left = NULL; // 关键:初始化左指针
        new_node->right = NULL; // 关键:初始化右指针
        return new_node;
    }
    // 后续的插入逻辑...
    if (value < root->data) {
        root->left = insert_bst(root->left, value);
    } else {
        root->right = insert_bst(root->right, value);
    }
    return root;
}

总结

  1. 给print_bst_node加上空指针判断,是解决当前遍历异常的核心步骤;
  2. 确保插入新节点时正确初始化左右指针,避免野指针问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:39:35