从上到下打印二叉树

题目:从上到下打印二叉树的每一个节点,同层的节点按照从左到右的顺序打印.例如:

    8   

  6   10 

5  7  9  11


输出为:8, 6, 10, 5, 7, 9, 11

分析

一眼看上去可能有点复杂,首先打印第一个节点8,然后打印8的左右节点6和10,最后需要打印6的左右子树和10的左右子树,那么问题就来了.打印10的时候需要记录6的左右子树以便10输出完毕后回到6的左子树5的上面.这个问题要如何解决呢?

我们可以用到一个队列,队列拥有先进先出的特性,当我们输入8时,我们让它的左右子树一次入队,然后出队操作,出队的结点进行打印并且出队的结点的左右子树进行入队.具体如下:

步骤 操作 队列
1 打印结点8 结点6,结点10
2 打印结点6 结点10,结点5,结点7
3 打印结点10 结点5,结点7,结点9,结点11
4 打印结点5 结点7,结点9,结点11
5 打印结点7 结点9,结点11
6 打印结点9 结点11
7 打印结点11

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Test {

static Queue<BinaryTreeNode> queue = new LinkedList<>();

public static void main(String[] args) {
BinaryTreeNode node7 = new BinaryTreeNode(5,null,null);
BinaryTreeNode node6 = new BinaryTreeNode(7,null,null);
BinaryTreeNode node5 = new BinaryTreeNode(9,null,null);
BinaryTreeNode node4 = new BinaryTreeNode(11,null,null);
BinaryTreeNode node3 = new BinaryTreeNode(6,node7,node6);
BinaryTreeNode node2 = new BinaryTreeNode(10,node5,node4);
BinaryTreeNode node1 = new BinaryTreeNode(8,node3,node2);

printFromTopToBottom(node1);

}

private static void printFromTopToBottom(BinaryTreeNode node){
if (node==null) return;
queue.offer(node);
while (queue.size()>0){
System.out.print(queue.poll().getmValue()+"\t");
if (node.getmLeftNode() != null){
printFromTopToBottom(node.getmLeftNode());
}
if (node.getmRightNode() != null){
printFromTopToBottom(node.getmRightNode());
}
}
}
}

总结

要善于使用辅助型的工具,比如队列,栈等等.