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

Print any given binary TreeSet by level -Java

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

为简单起见,输出将如下所示:

40
12    58
3    28    41    83

使用或不使用节点都很好,但我很想看看没有它们的版本。

编辑:

澄清一下,我说的是 java.util.TreeSet

所以自从我发布它以来我一直在研究它,我想出了一个方法,我称之为 getRoot,它接受一个 TreeSet<Integer> 作为参数和 returns一个 Integer 这是树的中间。因此,例如,如果您在示例树上调用它,它将 return 40.

所以现在我想可能有一种方法可以递归地做我正在谈论的事情,通过在子树上调用 getRoot,例如tailSetheadSet 一棵树,如果这有意义的话。但是,我无法让它遍历树的每个分支。到目前为止我的代码:

public TreeSet<Integer> recursivePlease(TreeSet<Integer> t){
        if (t.size()<=1){ //base case
            System.out.println(t.first());
            return t;
        }else{
            System.out.println(getRoot(t));
            return recursivePlease((TreeSet<Integer>) t.headSet(getRoot(t)));
        }
    }

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

您的代码是一个很好的起点。您只打印树左侧的问题来自于这样一个事实,即从第二行开始您必须打印两棵树,在第三行最多打印四棵树,您的方法无法处理,因为它只需要一棵树作为参数。所以我们将不得不改变它来获取任意数量的树。我选择了 List<SortedSet<Integer>>(其中 SortedSetTreeSet 实现的接口之一)。当然,这需要重写方法中的一部分逻辑来处理更多的树。我没有看到需要 returning 任何东西,所以我将 return 类型更改为 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() 结果可能会有所不同。