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

如何在Java中以Node.js风格打印二叉树(Binary Tree)

从Node.js转Java:如何像打印JS对象那样输出二叉树?

嘿,刚从Node.js切换到Java开发是吧?太懂你这种需求了——在Node里随手console.log(tree)就能看到对象的结构化输出,可Java默认的toString()只会给你个类名加哈希码,完全没法看树的结构。咱们一步步来搞定这个问题~

首先先把你给出的二叉树代码补全(缺了构造函数,不然没法用new BinaryTree(1)初始化):

public class BinaryTree {
    int data;
    BinaryTree left, right;

    // 补全构造函数
    public BinaryTree(int data) {
        this.data = data;
        this.left = null;
        this.right = null;
    }

    public static void main(String[] args) {
        BinaryTree tree = new BinaryTree(1);
        tree.left = new BinaryTree(2);
        tree.right = new BinaryTree(3);
        tree.left.right = new BinaryTree(4); // 补全你未写完的节点
        // 现在咱们要实现类似Node的打印效果
        System.out.println(tree);
    }
}

方法1:生成JSON风格的结构化字符串(最接近Node打印效果)

Java里要自定义对象的打印格式,核心是重写Object类的toString()方法。咱们写一个递归的版本,生成和Node打印对象类似的JSON结构:

@Override
public String toString() {
    // 处理子节点为null的情况
    String leftStr = (left == null) ? "null" : left.toString();
    String rightStr = (right == null) ? "null" : right.toString();
    return String.format("{ data: %d, left: %s, right: %s }", data, leftStr, rightStr);
}

运行main方法后,输出会是:

{ data: 1, left: { data: 2, left: null, right: { data: 4, left: null, right: null } }, right: { data: 3, left: null, right: null } }

这和你在Node里直接打印对象的结构几乎一模一样,非常适合快速查看树的整体结构。

方法2:带缩进的层级树形结构(更直观)

如果树的层级比较深,JSON风格的字符串会挤在一起不好读,咱们可以写一个带缩进的版本,让树的层级一目了然:

// 重载toString方法,支持传入缩进字符串
public String toString(String indent) {
    String nextIndent = indent + "  ";
    // 处理左子节点
    String leftStr = (left == null) 
        ? nextIndent + "null" 
        : left.toString(nextIndent);
    // 处理右子节点
    String rightStr = (right == null) 
        ? nextIndent + "null" 
        : right.toString(nextIndent);
    
    return String.format("%sdata: %d\n%sleft: %s\n%sright: %s", 
                        indent, data, indent, leftStr, indent, rightStr);
}

// 重写默认toString,调用带空缩进的版本
@Override
public String toString() {
    return toString("");
}

这时候运行main方法,输出会是:

data: 1
left:   data: 2
        left:   null
        right:   data: 4
                left:   null
                right:   null
right:   data: 3
        left:   null
        right:   null

这种格式能清晰看到每个节点的层级关系,调试复杂树结构的时候特别好用。

小提示

  • 如果你的二叉树非常大,递归实现的toString()可能会触发栈溢出,这时候可以改用迭代遍历(比如广度优先遍历)来生成打印字符串,不过一般中小型树递归完全够用。
  • 如果你想直接用JSON序列化工具(比如Jackson),也能快速把对象转成JSON字符串,但为了调试打印引入第三方库有点小题大做,自己写toString()更轻量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:22:34