我想逐级打印二叉树的节点。为此,我读了这篇文章: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
。
答案 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);
}
}