按级别-Java打印任何给定的二进制TreeSet

时间:2016-10-25 05:23:37

标签: java printing treeset

我已经看到很多关于如何逐层打印出树的问题(How to print binary tree diagram?),它们似乎都在使用节点,但主要是它们定义了每个节点,并通过以下方式给出了特定的指针: hand ...我正在寻找一种方法来做同样的事情,按级别打印出一棵树,但你得到一个Integer类型的TreeSet(例如{3,12,28,40,41,58,83}),你不知道是什么直到运行时才进入它。

为简单起见,输出看起来像这样:

40
12    58
3    28    41    83

使用或不使用节点很好,但我有兴趣看到没有节点的版本。

编辑:

澄清一点,我在谈论java.util.TreeSet

所以我一直在努力解决这个问题,因为我发布了它,并且我想出了一个我称之为getRoot的方法,该方法将TreeSet<Integer>作为参数并返回Integer是树的中间。因此,例如,如果您在示例树上调用它,它将返回40

所以现在我想通过在子树上调用getRoot,可能有办法递归地做我正在谈论的事情。 {@ 1}}和tailSet的树,如果这是有道理的。然而,我无法让它贯穿树的每个分支。到目前为止我的代码:

headSet

这个......有效。但它只是打印树的左侧。任何帮助使这个方法打印整个树或完整的其他想法,非常感谢。

1 个答案:

答案 0 :(得分:1)

您的代码是一个很好的起点。只打印树左侧的问题来自于第二行必须打印两棵树,第三行最多四棵树,你的方法无法处理,因为它只需要一棵树作为参数。所以我们必须改变它以采取任意数量的树木。我选择了List<SortedSet<Integer>>(其中SortedSetTreeSet实现的接口之一)。这需要重写方法中的一部分逻辑来处理更多的树。我没有看到返回任何东西的需要,所以我将返回类型更改为void。这就是我最终的结果:

public void recursivePlease(List<SortedSet<Integer>> trees) {
    List<SortedSet<Integer>> nextLevelTrees = new ArrayList<>();
    for (SortedSet<Integer> t : trees) {
        if (t.size() <= 1) { //base case
            System.out.print("" + t.first() + ' ');
        } else {
            Integer root = getRoot(t);
            System.out.print("" + root + ' ');
            SortedSet<Integer> headSet = t.headSet(root);
            if (! headSet.isEmpty()) {
                nextLevelTrees.add(headSet);
            }
            SortedSet<Integer> tailSet = t.tailSet(root + 1);
            if (! tailSet.isEmpty()) {
                nextLevelTrees.add(tailSet);
            }
        }
    }
    System.out.println();
    if (! nextLevelTrees.isEmpty()) {
        recursivePlease(nextLevelTrees);
    }
}

对于第一个电话,您只有一棵树,因此您可以将其称为:

    recursivePlease(Collections.singletonList(t));

在我的电脑上打印:

40 
12 58 
3 28 41 83 

根据您的getRoot(),您的结果可能会有所不同。