无法将根打印到二进制树的叶子路径

时间:2016-05-04 00:55:42

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

我正在尝试打印二叉树的所有根到叶子路径,我需要将结果作为字符串列表返回。我正在尝试使用递归和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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

当您的树有来自当前节点的两条路径时,会发生此问题。您已将StringBuilder的同一个实例传递到binaryTreePathsHelper的两个实例中。这意味着两个路径都以单个字符串构建器结束。

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

如果您确实要传递StringBuilder的实例,则需要在递归调用binaryTreePathsHelper时复制它们。例如:

binaryTreePathsHelper(bT.getRightChild(), new StringBuilder(sb.toString());
相关问题