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

二叉树插入函数存入超10条数据失效,求排查解决

问题排查与修复:二叉树插入函数无法处理超过10条数据的问题

首先看你贴的addItemToTree代码,核心问题出在插入逻辑的局限性上:

你的代码目前只检查当前节点的左、右孩子是否为空,当当前节点的左右都被占满后,虽然尝试递归左子树,但代码没写完(node->left->lef...),就算写完,如果只递归左子树而没有遍历整个树的所有节点,当树的前几层(根+2子节点+4孙节点)被占满后,后续的插入就找不到可用的空位了——这就是为什么数据量超过一定数量(实际是7个节点后)就失效的原因。

修复方案:用广度优先搜索(BFS)实现层序插入

最稳妥的方式是用队列做层序遍历,找到树中第一个有空位(左/右孩子为空)的节点,插入新元素。这种方式符合完全二叉树的插入逻辑,能支持任意数量的节点插入。

先看修复后的完整代码:

#include <queue> // 记得引入队列头文件

// 你的节点结构保持不变
struct node { 
    int info; 
    node *left = NULL; 
    node *right = NULL; 
    node() {} 
    node(int data, node* ln = 0, node* rn = 0): info(data), left(ln), right(rn) {} 
};

bool addItemToTree(struct node* root, int item) {
    if (!root) {
        // 如果根节点为空,你可以选择返回false,或者改成传入node** root来创建根节点
        return false;
    }

    // 处理根节点未初始化的情况(比如用默认构造函数创建的根)
    if (root->left == nullptr && root->right == nullptr && root->info == 0) {
        root->info = item;
        return true;
    }

    std::queue<node*> nodeQueue;
    nodeQueue.push(root);

    while (!nodeQueue.empty()) {
        node* currentNode = nodeQueue.front();
        nodeQueue.pop();

        // 先尝试插入左孩子
        if (!currentNode->left) {
            currentNode->left = new node(item);
            return true;
        } else {
            nodeQueue.push(currentNode->left);
        }

        // 左孩子满了,尝试插入右孩子
        if (!currentNode->right) {
            currentNode->right = new node(item);
            return true;
        } else {
            nodeQueue.push(currentNode->right);
        }
    }

    // 理论上不会走到这里,因为二叉树可以无限扩展
    return false;
}

为什么这个方案能解决问题?

  • 队列帮我们按层遍历所有节点,从根节点开始,依次检查每个节点的左、右孩子,确保我们找到第一个可用的空位,不会漏掉树中任何可能的插入位置。
  • 不管你的树有多少层、多少节点,只要内存足够,就能持续插入新元素。

可选:递归实现(深度优先插入)

如果你更倾向于递归写法,也可以这样实现(注意:这种方式是深度优先插入,和层序插入的节点顺序不同):

bool addItemToTree(struct node* node, int item) {
    if (!node) return false;

    // 先插左孩子
    if (!node->left) {
        node->left = new node(item);
        return true;
    }
    // 左孩子满了插右孩子
    if (!node->right) {
        node->right = new node(item);
        return true;
    }
    // 当前节点满了,先递归左子树,左子树不行再递归右子树
    if (addItemToTree(node->left, item)) {
        return true;
    }
    return addItemToTree(node->right, item);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:07:13