簡體   English   中英

按級別打印任何給定的二進制TreeSet -Java

[英]Print any given binary TreeSet by level -Java

我已經看到了很多有關如何按級別打印樹的問題( 如何打印二叉樹圖? ),它們似乎都在使用節點,但主要是它們定義了每個節點並手動為其指定了特定的指針...我正在尋找一種方法來做同樣的事情,逐級打印出一棵樹,但是給了您一個整數類型的TreeSet(例如{3,12,28,40,41,58,83} ),直到運行時您都不知道其中會有什么。

為了簡單起見,輸出如下所示:

40
12    58
3    28    41    83

使用或不使用Nodes都可以,但是我很想看看沒有它們的版本。

編輯:

為了澄清,我正在談論java.util.TreeSet

因此,自發布以來,我一直在研究此問題,並提出了一個名為getRoot的方法,該方法將TreeSet<Integer>作為參數並返回一個Integer ,該Integer位於Tree的中間。 因此,例如,如果您在示例樹上調用它,它將返回40

所以現在我在想,也許有一種方法可以通過在子樹(例如樹的tailSetheadSet上調用getRoot來遞歸地執行我正在談論的事情。 但是,我無法使它遍歷樹的每個分支。 到目前為止,我的代碼:

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實現的接口之一)。 當然,這需要重寫該方法中的一部分邏輯以處理更多的樹。 我看不到需要返回任何東西,因此我將返回類型更改為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()結果可能有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM