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

实现二叉搜索树前序遍历为何需传入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

错误原因

  1. 你定义的preOrder和inOrder方法强制要求接收一个BinaryNode类型参数,Java中没有自动匹配无参调用的逻辑,不传参时找不到对应方法,直接报编译错误。
  2. 另外代码隐含一个问题:insert的公共方法没有更新root节点,导致插入数据后树的根节点始终为null,实际调用带参的preOrder也不会有输出。

解决方案

修复方案

  1. 新增无参的遍历方法,内部自动传入当前树的root节点,外部调用时无需手动传参。
  2. 修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:42:51