Java广度优先搜索不错的打印

时间:2016-11-11 14:37:31

标签: java tree breadth-first-search

这是我的广度优先搜索代码。 我想逐级打印。一行一级。

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 :( root(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)

2 个答案:

答案 0 :(得分: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 ,因此您不会在每次迭代中都进行添加:

frm_addBook

答案 1 :(得分: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())
   ...
}

这不是你要求的,但它已经接近了。要删除最后一个" - "并对齐水平,您需要在打印之前存储整行,并在生成任何输出之前检查最长行的长度。