实现二叉搜索树前序遍历为何需传入newBst.root?报错排查
二叉搜索树前序遍历调用问题
我在实现二叉搜索树的前序遍历时遇到问题:调用preOrder方法并传入newBst.root时可得到预期输出,但不传参则触发编译错误,错误提示为:
method preOrder in class treedataStructure.BinaryserachTree cannot be applied to given types; required: treedataStructure.BinaryNode
相关代码
public class Main { public static void main(String[] args) { BinarySearchTree newBST = new BinarySearchTree(); newBST.insert(70); newBST.insert(50); newBST.insert(90); newBST.insert(30); newBST.insert(60); newBST.insert(80); newBST.insert(100); newBST.insert(20); newBST.insert(40); newBST.preOrder(newBST.root); newBST.inOrder(newBST.root); } } public class BinaryNode { public int value; public int height; public BinaryNode left; public BinaryNode right; } public class BinarySearchTree { BinaryNode root; public BinarySearchTree() { root = null; } private BinaryNode insert(BinaryNode currentNode, int value) { if(currentNode == null) { BinaryNode newNode = new BinaryNode(); newNode.value = value; System.out.println("The value successfully inserted"); return newNode; } else if(value <= currentNode.value){ currentNode.left = insert(currentNode.left, value); return currentNode; } else { currentNode.right = insert(currentNode.right, value); return currentNode; } } public void insert(int value) { insert(root, value); } public void preOrder(BinaryNode node) { if(node == null) { return; } System.out.print(node.value + " "); preOrder(node.left); preOrder(node.right); } public void inOrder(BinaryNode node) { if(node == null) { System.out.println("ACV"); return; } inOrder(node.left); System.out.print(node.value + " "); inOrder(node.right); } }
预期输出
70 12 80 90
实际输出
method preOrder in class treedataStructure.BinaryserachTree cannot be applied to given types; required: treedataStructure.BinaryNode
错误原因
- 你定义的
preOrder和inOrder方法强制要求接收一个BinaryNode类型参数,Java中没有自动匹配无参调用的逻辑,不传参时找不到对应方法,直接报编译错误。 - 另外代码隐含一个问题:
insert的公共方法没有更新root节点,导致插入数据后树的根节点始终为null,实际调用带参的preOrder也不会有输出。
解决方案
修复方案
- 新增无参的遍历方法,内部自动传入当前树的
root节点,外部调用时无需手动传参。 - 修复
insert方法,让它正确更新root节点。
修改后的完整代码
public class Main { public static void main(String[] args) { BinarySearchTree newBST = new BinarySearchTree(); newBST.insert(70); newBST.insert(50); newBST.insert(90); newBST.insert(30); newBST.insert(60); newBST.insert(80); newBST.insert(100); newBST.insert(20); newBST.insert(40); // 现在可以直接无参调用遍历方法 newBST.preOrder(); System.out.println(); newBST.inOrder(); } } class BinaryNode { public int value; public int height; public BinaryNode left; public BinaryNode right; } class BinarySearchTree { BinaryNode root; public BinarySearchTree() { root = null; } private BinaryNode insert(BinaryNode currentNode, int value) { if (currentNode == null) { BinaryNode newNode = new BinaryNode(); newNode.value = value; System.out.println("The value successfully inserted"); return newNode; } else if (value <= currentNode.value) { currentNode.left = insert(currentNode.left, value); return currentNode; } else { currentNode.right = insert(currentNode.right, value); return currentNode; } } // 修复insert方法,更新root节点 public void insert(int value) { root = insert(root, value); } // 保留带参私有方法用于递归逻辑 private void preOrder(BinaryNode node) { if (node == null) { return; } System.out.print(node.value + " "); preOrder(node.left); preOrder(node.right); } // 新增无参公共方法,供外部直接调用 public void preOrder() { preOrder(root); } private void inOrder(BinaryNode node) { if (node == null) { return; } inOrder(node.left); System.out.print(node.value + " "); inOrder(node.right); } public void inOrder() { inOrder(root); } }
说明
- 把原带参遍历方法改为私有,只做内部递归使用;新增无参公共方法,自动以树的
root为起始节点,符合外部调用的直觉。 - 修复后的
insert方法会将递归返回的新节点赋值给root,确保树的结构正确维护。 - 实际运行前序遍历的输出应为:
70 50 30 20 40 60 90 80 100(你提供的预期输出存在错误,插入的数值中没有12)
内容的提问来源于stack exchange,提问作者Lohit Kumar Biswas
相关产品推荐
相关产品推荐

