题目描述:
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回:
[3,9,20,15,7]
提示:
节点总数 <= 1000
解题思路:
以题目中的例子来说明,首先拿到的第一个节点应该是根节点,然后是根节点的左节点,再右节点,然后到第三层,根节点的左节点的左节点,根节点的左节点的右节点,然后是根节点的右节点的左节点,根节点的右节点的右节点……可以看出,一个节点的遍历顺序是先根节点,再左节点,然后右节点,如果用一个容器来装这些节点,开始容器里只有一个根节点,遍历了根节点之后,又往容器里添加了根节点的左右节点,然后再遍历到根节点的左节点,如果这个节点有子节点,再把它的子节点放进容器……可以推出,遍历节点的顺序就是进入容器的顺序,按照先进先访问的顺序遍历,符合对了Queue的特点。使用Queue的时候,访问完一个节点就往外丢一个节点,到最后如果Queue中没有节点了,说明遍历了全部的节点。
代码(Java):
package levelOrder_32;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class Solution {
public static void main(String[] args) {
TreeNode root = new TreeNode(8);
root.left = new TreeNode(6);
root.right = new TreeNode(10);
root.left.left = new TreeNode(5);
root.left.right = new TreeNode(7);
root.right.left = new TreeNode(9);
root.right.right = new TreeNode(11);
int[] ans = levelOrder(root);
for(int i = 0; i<ans.length;i++){
System.out.print(ans[i] + "\t");
}
}
public static int[] levelOrder(TreeNode root){
if(root == null) return new int[0];
List<Integer> list = new ArrayList<Integer>(); //用于存放由上到下遍历到的节点的值
Queue<TreeNode> queue = new LinkedList<>(); //由上到下遍历,满足先进先出的特点,用Queue来做
queue.add(root); //先把根节点放进队列
while(!queue.isEmpty()){ //每次会判断当前节点的左、右节点,如果不是空就放进队列,遍历完一个节点丢出一个节点,当到最后遍历完了,队列也清空了
TreeNode node = queue.poll();
list.add(node.val);
if(node.left != null){
queue.add(node.left);
}
if(node.right != null){
queue.add(node.right);
}
}
int[] ans = new int[list.size()]; //将list转化为数组,返回数组
for(int i = 0;i<list.size();i++){
ans[i] = list.get(i);
}
return ans;
}
}