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

Java实现AVL树后序遍历如何将结果存入字符串而非控制台

实现方案

你只需要把递归逻辑里「打印到控制台」的操作,替换为「向可变字符串容器追加内容」即可,Java中优先使用StringBuilder做字符串拼接,避免不可变String拼接产生的大量临时对象开销。

注意递归过程中要传递同一个StringBuilder实例,保证所有节点的内容都能追加到同一字符串中,不要在每层递归里新建字符串容器。


后序遍历改造示例

/**
 * 对外暴露的入口方法,传入AVL树根节点,返回后序遍历结果字符串
 * @param root 树的根节点
 * @return 空格分隔的后序遍历结果
 */
public String getPostorderResult(Node root) {
    StringBuilder resultContainer = new StringBuilder();
    doPostorderTraverse(root, resultContainer);
    // 去除末尾多余的空格,不需要可以去掉trim()
    return resultContainer.toString().trim();
}

/**
 * 内部递归遍历方法,复用同一个StringBuilder拼接结果
 */
private void doPostorderTraverse(Node node, StringBuilder sb) {
    if (node == null) {
        return;
    }
    // 遍历左子树
    doPostorderTraverse(node.left, sb);
    // 遍历右子树
    doPostorderTraverse(node.right, sb);
    // 处理根节点:把原来的System.out.print替换为追加到StringBuilder
    sb.append(node.element).append(" ");
}

前序、中序遍历的改造逻辑

三种遍历的改造逻辑完全一致,只需要调整追加当前节点内容的位置即可:

  • 前序遍历(根-左-右):先执行sb.append(node.element).append(" "),再递归遍历左、右子树
  • 中序遍历(左-根-右):先递归左子树,再执行追加操作,最后递归右子树
  • 后序遍历(左-右-根):即上述示例的写法,先递归左右子树,最后追加当前节点

不推荐的写法

不要直接让递归方法返回String做拼接,类似下面的代码:

// 不推荐:节点数量较多时会产生大量临时String对象,性能很差
public String badPostorderImpl(Node node) {
    if (node == null) return "";
    String left = badPostorderImpl(node.left);
    String right = badPostorderImpl(node.right);
    return left + right + node.element + " ";
}

这种写法因为Java String是不可变类型,每次+拼接都会生成新的字符串对象,树规模大时内存和时间开销都会明显升高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:51:12