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

如何在控制台中正确展示前缀树(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:00:05