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
相关产品推荐
相关产品推荐

