簡體   English   中英

Java廣度優先搜索漂亮的印刷品

[英]Java Breadth-first-search nice print

這是我的廣度優先搜索代碼。 我想逐級打印。 一線,一級。

public static void printTreeBreadthFirst(Tree t)
{
    Node root = t.getRoot();
    Queue<Node> queue = new LinkedList<Node>() ;
        if (root == null)
            return;
        queue.clear();
        queue.add(root);
        while(!queue.isEmpty()){
            Node<?> node = queue.remove();
            System.out.println(node.getData() + " ");
            if(node.getChildren().isEmpty())
                continue;
            else
                queue.addAll(node.getChildren());
        }
}

但是,由於它在同一行上打印所有內容,因此打印效果不佳。 如何實現這種精美的打印效果?

編輯:好的打印輸入示例:(root(child1(child1.1,child 1.2)(child 2(child 2.1))(child3))NICE輸出:

root                           (level 1)
child1 - child2 - child3       (level 2)
child1.1 - child1.2 - child2.1 (level 3)

為了獲得所需的“漂亮的打印效果”,當您從隊列中拉出節點時,您將丟失該level 因此,您必須創建一個要插入隊列的新結構,例如

class NodeLevel {
    private Node node;
    private int level;
    // ... constructor, getters, ...
}

每次將新元素添加到隊列中時,都使用current level + 1

因此,首先插入根與級別1:

queue.add(new NodeList(root, 1));

從隊列中刪除元素時,請保存級別:

NodeList nodeList = queue.remove();
Node<?> node = nodeList.getNode();
int level = nodeList.getLevel();
// pretty print using the node & level

並添加level + 1新子level + 1

node.getChildren().forEach(child -> queue.add(new NodeList(child, level + 1))); 

或者,您可以在從NodeList檢索level時簡單地增加level ,因此不必在每次迭代中都進行添加:

int childLevel = nodeList.getLevel() + 1;
//pretty print

復雜的部分是知道給定級別的結束時間。 節點(通常)不知道其級別,但是可以通過計算它們擁有多少祖先來找到它:

public static void getLevel(Node n) {
   return n == null ? 0 : 1 + getLevel(n.getParentNode());
}

計算這些級別的另一種更有效的方法是將其存儲在節點本身中,並將這些擴展的節點存儲在Queue

public class NodeWithLevel {
   private Node node;
   private int level;
   ...
}

現在,您只需要更改打印代碼即可檢查級別。 如果級別增加,則應跳過一行:

int currentLevel = 0; // level of root
while (...) {
   ...
   System.out.print(node.getData() + " - ");
   if (getLevel(node) > currentLevel) {
       currentLevel ++;
       System.out.println(" (level " + currentLevel + ")");
   }
   if(node.getChildren().isEmpty())
   ...
}

這與您要求的不完全相同,但是很接近。 要刪除最后一個" - "並對齊級別,您需要在打印整行之前存儲它們,並在生成任何輸出之前檢查最長行的長度。

暫無
暫無

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

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