如何修改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
相关产品推荐
相关产品推荐

