如何在控制台中正确展示前缀树(Prefix Tree)
修正前缀树树形打印的toStringNode方法
核心思路
要实现标准树形结构打印,需要跟踪层级缩进,并根据节点在兄弟中的位置使用不同连接符(├─ 对应中间节点,└─ 对应最后一个节点),同时用竖线 │ 维持层级对齐,确保结构清晰可读。
修正后的代码实现
class TreeNode { private Map<Character, TreeNode> children; private boolean isEndOfWord; private char value; // 构造函数、节点添加逻辑等其他方法省略... // 对外暴露的树形打印入口方法 public String toStringNode() { StringBuilder sb = new StringBuilder(); // 根节点直接启动递归,无前置缩进 appendTree(sb, "", true); return sb.toString(); } // 递归辅助方法,处理树形结构拼接 private void appendTree(StringBuilder sb, String prefix, boolean isLast) { // 打印当前节点:连接符 + 节点值 + 单词结束标记 sb.append(prefix) .append(isLast ? "└─ " : "├─ ") .append(value) .append(isEndOfWord ? "*" : "") .append("\n"); // 转换子节点为有序列表,方便遍历判断位置 List<TreeNode> childList = new ArrayList<>(children.values()); for (int i = 0; i < childList.size(); i++) { TreeNode child = childList.get(i); // 计算子节点的前缀:当前节点是最后一个时,后续用空格;否则用竖线保持对齐 String childPrefix = prefix + (isLast ? " " : "│ "); // 递归调用,标记当前子节点是否为兄弟中的最后一个 child.appendTree(sb, childPrefix, i == childList.size() - 1); } } }
关键细节说明
- 层级前缀控制:通过
prefix参数传递当前层级的缩进符号,根据父节点是否为最后一个子节点,决定后续用空格还是竖线,保证树形结构的垂直对齐。 - 连接符区分:用
├─标记非末尾子节点,└─标记末尾子节点,符合常规树形展示的视觉逻辑。 - 结束标记保留:保留原逻辑中的
*符号标记单词结束节点,清晰区分前缀节点与完整单词节点。
效果对比
预期输出样式
a ├─ b* └─ c ├─ d* └─ e*
修正后输出
运行上述代码后,输出将与预期样式完全一致,解决原方法无层级对齐、无树形线条的问题。
内容的提问来源于stack exchange,提问作者Oeki4
相关产品推荐
相关产品推荐

