题目描述
从上到下打印二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如下图,则依次打印出1,2,3,4,5,6,7。
二叉树节点如下:
public class BinaryTreeNode {
int value;
BinaryTreeNode left;
BinaryTreeNode right;
}
测试用例
- 功能测试(完全二叉树;所有节点只有左子树的二叉树;所有节点只有右子树的二叉树)
- 特殊功能测试(二叉树根节点为空指针;只有一个节点的二叉树)
题目考点
- 考察应聘者的思维能力,想到用队列处理按层遍历。
- 考察应聘者对二叉树及队列的理解。
解题思路
详细见书上表格,使用队列实现树的遍历,打印规律:
1、头节点放入队列;
2、队列不为空,则打印队列的头节点(先入,先出);
3、判断取出的头节点有无子节点。如果有子节点,将其入队列的末尾;如果没有,队列不变;
4、循环,直到队列为空。
参考解题
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
// 异常
ArrayList<Integer> result = new ArrayList<>();
if(root == null){
return result;
}
//定义队列(容器),按照打印顺序存储节点
Queue<TreeNode> queue = new LinkedList<>();
// 根节点入队
queue.offer(root);//offer(E e)如果在不违反容量限制的情况下立即执行,则将指定的元素插入到此队列中。
// 循环直到队列为空
while(!queue.isEmpty()){
// 队列不为空,打印队列头节点(放入结果容器)
TreeNode node = queue.poll();// 检索并删除此队列的头,如果此队列为空,则返回 null 。
result.add(node.val);
//判断取出的头节点有无子节点。如果有子节点,将其入队列的末尾;如果没有,队列不变;
if(node.left != null){
queue.offer(node.left);
}
if(node.right != null){
queue.offer(node.right);
}
}
return result;
}
}
补充
不管是广度优先遍历一副有向图还是一颗树,都要用到队列或者栈。
1、首先,把起始节点(对树而言是根节点)放入队列;
2、接下来,每次从队列中取出一个节点;
3、遍历这个节点能够达到的节点(对树而言是子节点),依次序放入队列;
4、重复这个遍历过程,直到队列中的节点全部被遍历为止。