【问题标题】:Having trouble printing root to leaf paths for binary tree无法打印二叉树的根到叶路径
【发布时间】:2016-08-29 05:48:10
【问题描述】:

我正在尝试打印二叉树的所有根到叶路径,我需要将结果作为字符串列表返回。我正在尝试使用递归和 StringBuilders 来执行此操作,但是对于每个新路径,它不是删除旧路径,而是附加到它。

如果从根到叶的路径是 5->3->2->1、5->3->4、5->7->6 和 5->7->8(我的例子使用),我的结果如下:

5->3->2->1

5->3->2->14

5->3->2->147->6

5->3->2->147->68

这是因为我使用 StringBuilder 的方式,但我无法弄清楚我做错了什么。以下是我的整个代码。任何帮助将不胜感激:

public class solution{
    static List<String> allPaths = new ArrayList<String>();
    public static List<String> binaryTreePaths (BinaryTree bT){
        StringBuilder sb = new StringBuilder();
        binaryTreePathsHelper(bT, sb);
        return allPaths;
    }

    public static void binaryTreePathsHelper(BinaryTree bT, StringBuilder sb){
        if (bT == null){
            return;
        }
        if (bT.getLeftChild() == null && bT.getRightChild() == null){
            sb.append(bT.getRoot() + "");
            allPaths.add(sb.toString());
            sb = new StringBuilder();
        }
        else{
            sb.append(bT.getRoot() + "->");
        }
        if (bT.getLeftChild() != null){
            binaryTreePathsHelper(bT.getLeftChild(), sb);
        }
        if (bT.getRightChild() != null){
            binaryTreePathsHelper(bT.getRightChild(), sb);
        }
    }
}

【问题讨论】:

  • 我认为你不能用一个字符串来做到这一点。相反,每个递归步骤都会返回一个路径集合。

标签: java binary-tree stringbuilder depth-first-search


【解决方案1】:

当您的树从当前节点有两条路径时,就会出现问题。您将StringBuilder 的同一个实例传递给binaryTreePathsHelper 的两个实例。这意味着两条路径都以单个字符串生成器结束。

最简单的解决方案是不要传递StringBuilder。相反,传递String。然后,您将在每次附加到传入的 String 时创建新的 Strings,从而消除意外对象重用的可能性。

如果你真的想传递StringBuilder 的实例,你需要在递归调用binaryTreePathsHelper 时复制它们。例如:

binaryTreePathsHelper(bT.getRightChild(), new StringBuilder(sb.toString());

【讨论】:

  • 非常感谢。我知道我做错了,因为我在 Eclipse 中使用调试器,但对如何修复它一无所知。我尝试将副本作为浅副本传递,但这没有帮助。这完美地解决了它,所以谢谢你!
  • 不客气。让未来的读者知道,接受这个答案对你有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多