逐级打印二进制树的节点(Java)

时间:2014-07-10 09:22:41

标签: java tree queue binary-tree

我想逐级打印二叉树的节点。为此,我读了这篇文章:http://leetcode.com/2010/09/printing-binary-tree-in-level-order.html,我想用两个队列实现该方法。这是我的方法:

 private static void printByLevel2(Node root) {
    q = new LinkedList<Node>();
    q.add(root);
    Queue<Node> nextLevel = new LinkedList<Node>();
    while(!q.isEmpty()){
        Node n = q.remove();
        printNode(n);
        if(hasLeftChild(n)){
            nextLevel.add(n.left);
        }
        if(hasRightChild(n)){
            nextLevel.add(n.right);
        }
        if(q.isEmpty()){
            System.out.println();
            q = nextLevel;
            nextLevel.clear();
        }
    }
}

它是如何工作的。在行q = nextLevel上,我希望队列q指向队列nextLevel(即,其中一个包含下一级别的节点)。如何将队列q保持为空。有人能解释一下为什么吗?此外,如果我想将节点从队列nextLevel“转移”到队列q,我应该如何快速完成?我看到的唯一方法是迭代nextLevel中的元素并将它们推送到q

2 个答案:

答案 0 :(得分:0)

当你这样做时

q = nextLevel;

您只是复制引用,因此当您清除nextLevel时,您将丢失所有元素。

更改

nextLevel.clear();

nextLevel = new LinkedList<Node>();

nextLevel指向新队列。

答案 1 :(得分:0)

您只需要一个队列进行广度优先搜索(BFS),最终可以满足您的需求。当您将子项放在队列的末尾时,您仍然在其前面具有相同的级别元素。所以你可以这样做而不是

Queue<Node> q = new LinkedList<Node>();
while(!q.isEmpty()){
    Node n = q.remove();
    printNode(n);
    if(hasLeftChild(n)){
        q.add(n.left);
    }
    if(hasRightChild(n)){
        q.add(n.right);
    }

}