Binary Node Tree打印格式异常求助:自定义toString输出不符预期
修正二叉树字符串格式化代码
我看了你的问题和代码,核心问题是递归逻辑的顺序和括号处理完全不符合你想要的格式规则。我们先明确你需要的格式规则:
- 叶子节点表示为
(data) - 只有左子树的节点表示为
(左子树字符串, data) - 只有右子树的节点表示为
(data, 右子树字符串) - 有左右子树的节点表示为
(左子树字符串, data, 右子树字符串)
你的原代码在递归时颠倒了括号的顺序,字符串拼接逻辑混乱,还保留了多余的空格处理逻辑。下面是修正后的代码,同时用StringBuilder优化了字符串拼接效率:
// 递归辅助方法,负责生成单个节点的字符串表示 private String buildTreeString() { StringBuilder sb = new StringBuilder(); boolean hasLeft = left != null; boolean hasRight = right != null; sb.append("("); if (hasLeft) { // 存在左子树,先拼接左子树的完整字符串 sb.append(left.buildTreeString()); if (hasRight) { // 左右子树都存在:左子串 + 逗号 + 当前节点 + 逗号 + 右子串 sb.append(",").append(this.data).append(",").append(right.buildTreeString()); } else { // 只有左子树:左子串 + 逗号 + 当前节点 sb.append(",").append(this.data); } } else if (hasRight) { // 只有右子树:当前节点 + 逗号 + 右子串 sb.append(this.data).append(",").append(right.buildTreeString()); } else { // 叶子节点:直接拼接当前节点数据 sb.append(this.data); } sb.append(")"); return sb.toString(); } @Override public String toString() { return buildTreeString(); }
修正逻辑说明:
- 递归逻辑对齐格式规则:每个节点根据自身子树存在情况,按照你需要的括号包裹规则生成字符串,确保子树的括号嵌套正确。
- 使用StringBuilder优化:避免递归中频繁拼接字符串产生大量临时对象,提升效率。
- 移除多余逻辑:删掉了原代码中无用的
length参数和空格循环,因为你的目标格式不需要空格,完全靠括号嵌套体现深度。
测试验证:
- 对于
t1,输出会是(((1),2,(3)),4,((5),6,(7,(8)))),完全符合你的预期。 - 对于
t4,输出会是((((((((1),2),3),4),5),6),7),8),和你给出的预期一致。
内容的提问来源于stack exchange,提问作者Yuki1112
相关产品推荐
相关产品推荐

