我已经看到很多关于如何逐层打印出树的问题(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
这个......有效。但它只是打印树的左侧。任何帮助使这个方法打印整个树或完整的其他想法,非常感谢。
答案 0 :(得分:1)
您的代码是一个很好的起点。只打印树左侧的问题来自于第二行必须打印两棵树,第三行最多四棵树,你的方法无法处理,因为它只需要一棵树作为参数。所以我们必须改变它以采取任意数量的树木。我选择了List<SortedSet<Integer>>
(其中SortedSet
是TreeSet
实现的接口之一)。这需要重写方法中的一部分逻辑来处理更多的树。我没有看到返回任何东西的需要,所以我将返回类型更改为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()
,您的结果可能会有所不同。