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

如何修改BST中序遍历方法使其返回值而非打印到控制台

修改BST中序遍历方法以返回结果并显示到JTextArea

嘿,我来帮你调整这个BST的中序遍历方法,让它返回结果而不是直接打印,这样就能轻松把内容放到你的Results文本域里了。

第一步:重构printInOrder方法

原来的方法是直接打印到控制台,我们需要改成返回拼接好的字符串,同时保留原来的nodecount和uc计数逻辑。为了递归中字符串拼接的效率,我们用StringBuilder来处理:

// 对外的方法,返回遍历结果字符串
public String printInOrder(BSTNode node) {
    StringBuilder resultBuilder = new StringBuilder();
    // 每次调用前重置计数(如果需要保留累计值可以去掉这两行)
    nodecount = 0;
    uc = 0;
    // 调用递归辅助方法完成遍历和拼接
    traverseInOrder(node, resultBuilder);
    return resultBuilder.toString();
}

// 内部递归辅助方法,负责实际遍历、拼接内容和更新计数
private void traverseInOrder(BSTNode node, StringBuilder sb) {
    if (node != null) {
        nodecount++;
        traverseInOrder(node.left, sb);
        // 把原本打印的内容拼接到StringBuilder里
        sb.append(node.word).append(" - ").append(node.data).append("\n");
        if (node.data == 1) {
            uc++;
        }
        traverseInOrder(node.right, sb);
    }
}

第二步:修改ActionListener的调用逻辑

原来的代码里调用了两次printInOrder,这会导致BST被遍历两次,计数也会翻倍。我们只需要调用一次,拿到结果后直接追加到JTextArea即可:

class Alphabetical implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        File f = new File(dir.getText() + "\\" + filename.getText());
        try {
            Scanner sc = new Scanner(f);
            BSTFunctions bs = new BSTFunctions();
            while (sc.hasNext()) {
                bs.insert(bs.ROOT, sc.next().toLowerCase().trim(), 1);
            }
            // 调用一次遍历方法获取结果
            String traversalOutput = bs.printInOrder(bs.ROOT);
            // 把结果追加到Results文本域
            results.append(traversalOutput);
            
            // (可选)如果需要显示计数结果,也可以在这里追加
            // results.append("\n总节点数: ").append(bs.nodecount).append("\n");
            // results.append("data为1的节点数: ").append(bs.uc).append("\n");
            
            sc.close();
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
    }
}

关键修改点说明

  • 用StringBuilder代替多次String拼接,提升递归遍历的效率
  • 拆分方法让逻辑更清晰:对外方法负责初始化和返回结果,内部方法处理递归遍历
  • 移除重复的printInOrder调用,避免不必要的遍历和错误的计数
  • 保留了原有的计数逻辑,你可以根据需求决定是否把计数结果也显示到文本域中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:46:24