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

Java二叉树toString方法输出异常,非空树却显示空树求排查

问题排查与修复

一、toString方法的核心逻辑错误

你的toString()方法逻辑完全混乱,导致无论树是否有节点,都可能错误返回"Baum ist leer":

  1. 第一个判断分支:仅当rhs == null时返回空树提示,且lhs == null时无任何操作——这完全搞反了空树的判断逻辑,空树的判定应该基于当前节点是否存在,而非子树的状态。
  2. 第二个判断分支:仅当rhs != null时递归调用右子树的toString,完全忽略了当前节点的数值和左子树的遍历,连基本的二叉树遍历逻辑都未实现。

二、修复后的toString方法

我们需要实现合理的二叉树遍历逻辑(以二叉搜索树常用的中序遍历为例),同时区分空树和叶子节点:

  • 空树:指根节点未初始化(即Tree root = null)
  • 叶子节点:指自身有数值,但左右子树均为null的节点

方案1:节点toString仅负责遍历,空树在主逻辑判断

如果你的Tree类通过new Tree(int value)创建节点,空树用Tree root = null表示,那么:

// 节点类的toString方法:实现中序遍历(左->中->右)
public String toString() {
    StringBuilder sb = new StringBuilder();
    if (lhs != null) {
        sb.append(lhs.toString()).append(" ");
    }
    sb.append(node);
    if (rhs != null) {
        sb.append(" ").append(rhs.toString());
    }
    return sb.toString();
}

在主程序中打印时判断空树:

public static void main(String[] args) {
    Tree root = new Tree(5);
    root.add(3);
    root.add(7);
    
    if (root == null) {
        System.out.println("Baum ist leer");
    } else {
        System.out.println(root.toString()); // 输出:3 5 7
    }
}

方案2:在toString内部处理空树判定

如果你的Tree类允许无参构造创建空树节点,可以在toString中直接判断:

public String toString() {
    // 判定空树:假设空树节点的node为默认值0,且无左右子树
    if (lhs == null && rhs == null && node == 0) {
        return "Baum ist leer";
    }
    
    StringBuilder sb = new StringBuilder();
    if (lhs != null) {
        sb.append(lhs.toString()).append(" ");
    }
    sb.append(node);
    if (rhs != null) {
        sb.append(" ").append(rhs.toString());
    }
    return sb.toString();
}

三、add方法验证

你的add()方法逻辑是正确的二叉搜索树插入逻辑,只要根节点初始化正确(比如Tree root = new Tree(初始值)),插入节点后就能正确构建树结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:18:20