01 题目
给一个二叉树,从上到下按照层序打印二叉树。
如
层序遍历结果位 1,2,3,4,5,6,7,8
02 解题&动图展示
用辅助队列完成。
根节点首先到队列里面排队,等待输出。
根节点被输出,将根节点的子孩子入队排队等待输出。
红色为已经入队的元素
文字描述过程
1.将跟节点1,放入队列中。
队列:1。
输出元素:
2.删除队首元素1,并输出,将1的两个子节点2,3入队。
队列:2,3。
输出元素:1
3.删除队首元素2,并输出,将2的两个子节点4,5,入队。
队列:3,4,5
输出元素:1,2
4.删除队首元素3,并输出,将3的两个孩子节点6,7,入队。
队列:4,5,6,7
输出元素:1,2,3
5.删除队首元素4,并输出,4无孩子节点,不入队列。
队列:5,6,7
输出元素:1,2,3,4
6.删除队首元素5,并输出,5无孩子节点,不入队列。
队列:6,7
输出元素:1,2,3,4,5
7.删除队首元素6,并输出,6的孩子节点8入列。
队列:7,8
输出元素:1,2,3,4,5,6
8.删除队首元素7,并输出,7无孩子节点,不入队列。
队列:8
输出元素:1,2,3,4,5,6,7
9.删除队首元素8,并输出,8无孩子节点,不入队列。
队列:
输出元素:1,2,3,4,5,6,7,8
队列为空,跳出循环。
03 总结&代码
1.首先将根节点入队列。
2.循环遍历删除队列元素,并且输出。(1)如果删除元素有孩子节点则入队。否则继续删除队首元素操作。
3.队列为空结束循环。
public class 面试题23层序打印二叉树 {
public static void printBinaryTree(BinaryTreeNode binaryTree) {
if (binaryTree == null) {
return;
}
Queue<BinaryTreeNode> queue = new LinkedBlockingQueue<>();
queue.add(binaryTree);
while (!queue.isEmpty()) {
BinaryTreeNode tmpTreeNode = queue.remove();
System.out.print(tmpTreeNode.value + " ");
if (tmpTreeNode.leftChild != null) {
queue.add(tmpTreeNode.leftChild);
}
if (tmpTreeNode.rightChild != null) {
queue.add(tmpTreeNode.rightChild);
}
}
}
public static void main(String[] args) {
BinaryTreeNode treeNode7 = new BinaryTreeNode(null, null, 7);
BinaryTreeNode treeNode6 = new BinaryTreeNode(null, null, 6);
BinaryTreeNode treeNode5 = new BinaryTreeNode(treeNode7, null, 5);
BinaryTreeNode treeNode4 = new BinaryTreeNode(null, null, 4);
BinaryTreeNode treeNode3 = new BinaryTreeNode(null, null, 3);
BinaryTreeNode treeNode2 = new BinaryTreeNode(treeNode5, treeNode6, 2);
BinaryTreeNode treeNode1 = new BinaryTreeNode(treeNode3, treeNode4, 1);
BinaryTreeNode treeNode = new BinaryTreeNode(treeNode1, treeNode2, 0);
printBinaryTree(treeNode);
}
}