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

Java二叉树层序(从左到右)插入节点方法及代码修复求助

修复二叉树层序插入的问题

嘿,我一眼就看到你代码里的问题了——每次调用insert方法时,你都重新创建了一个空队列,而且没有把当前树中已有的节点初始化到队列里!第一次插入根节点时没问题,但第二次调用insert时,else分支里的队列是空的,while循环直接跳过,自然没法找到下一个空位插入新节点。

问题具体分析

你的代码里,只有第一次插入根节点时会把root放进队列,但后续调用insert时:

  • 新创建的队列是空的,while (!q.isEmpty())条件不成立,代码根本不会执行插入逻辑
  • 你还用到了temp成员变量,这很容易导致状态混乱,应该用局部变量替代

修复后的完整代码

import java.util.LinkedList;
import java.util.Queue;

class TreeNode {
    int item;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int item) {
        this.item = item;
    }
}

class Tree {
    private TreeNode root; // 明确声明root成员变量

    public void insert(int item) {
        TreeNode newNode = new TreeNode(item);
        // 如果树为空,直接设为根节点
        if (root == null) {
            root = newNode;
            return;
        }

        // 每次插入都从根节点开始,初始化队列
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);

        while (!q.isEmpty()) {
            TreeNode current = q.poll(); // 取出队列头部节点,用局部变量current

            // 先检查左孩子是否为空
            if (current.left == null) {
                current.left = newNode;
                break;
            }
            // 左孩子不为空,检查右孩子
            if (current.right == null) {
                current.right = newNode;
                break;
            }
            // 左右孩子都存在,把它们加入队列继续遍历
            q.offer(current.left);
            q.offer(current.right);
        }
    }

    // 可以加一个层序遍历方法验证结果
    public void levelOrderTraversal() {
        if (root == null) return;

        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);

        while (!q.isEmpty()) {
            TreeNode current = q.poll();
            System.out.print(current.item + " ");
            if (current.left != null) q.offer(current.left);
            if (current.right != null) q.offer(current.right);
        }
    }

    public static void main(String[] args) {
        Tree tree = new Tree();
        tree.insert(1);
        tree.insert(2);
        tree.insert(3);
        tree.insert(4);
        tree.insert(5);
        tree.levelOrderTraversal(); // 输出:1 2 3 4 5
    }
}

关键修改点

  • 移除了temp成员变量,改用局部变量current,避免跨方法的状态污染
  • 每次插入时,都将root加入队列,保证从根节点开始层序遍历
  • 调整了队列的操作逻辑:取出节点后先检查左、右孩子,只有当两个孩子都存在时,才将它们加入队列,继续寻找下一个空位
  • 新增了levelOrderTraversal方法,方便你验证插入结果是否符合层序要求

现在你测试一下,插入多个节点后,层序遍历应该能正确输出从左到右的节点顺序啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:08:34