2016-11-11 44 views
0

這是我的廣度優先搜索代碼。 我想逐級打印。一條線,一個水平。Java廣而告之搜索不錯打印

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()); 
     } 
} 

但是,這不是一個很好的印刷,因爲它打印在同一行的一切。 如何實現這個漂亮的打印?

編輯:例如一個很好的打印 INPUT的:(根(child1(兒童1.1,兒童1.2)(子2(子2.1))(child3)) NICE輸出:

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

你可以提供一個例子說明如何打印'(root(child1(child1.1,child1.2)(child2(child2.1))(child3))',以使它看起來不錯?注意,深度優先的搜索對於漂亮的打印樹更爲典型... – tucuxi

+0

「漂亮的打印」究竟意味着什麼?它會通過搜索節點的深度縮進輸入嗎? – radoh

+0

我用例子更新了問題確定我的意思。 – user840718

回答

0

要獲得所需的「漂亮的打印」,你缺少的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增加新的孩子:

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

或者您可以簡單地增加level當您從中檢索它時NodeList,所以你不這樣做在每次迭代中加入:

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

在我發佈我之前,我沒有看到您的答案;我們似乎遵循了'NodeLevel'的非常類似的命名 – tucuxi

0

的複雜的部分是要知道,當一個給定的水平結束。節點不(通常)知道自己的水平,但可以通過計算髮現它有多少祖先有:

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()) 
    ... 
} 

這不完全是你要求的,但它是接近的。要刪除最後一個" - "並對齊水平,您需要在打印它們之前存儲所有行,並在生成任何輸出之前檢查最長行的長度。