1.题目
剑指 Offer 32 - I. 从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
提示:
节点总数 <= 1000
2.自我思路及实现
1.层序遍历,使用队列实现
使用队列,先将根节点入队列,读取队列顶端节点,将其左右子节点(非空)入队列
再将队列顶端节点出队列并存储其节点值到动态数组中
不断循环上述过程
最后将动态数组转化为数组
算法:
1.特例
2.创建队列和动态数组
3.将根节点入队列
4.当队列不为空进行循环:读取队列顶端节点,将其左右子节点(非空)入队列, 再将队列顶端节点出队列并存储其节点值到动态数组中
5.遍历动态数组,将值存入数组
时间N :遍历每个节点+遍历动态数组
空间N: 使用了大小为N的动态数组和最大为N的队列
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int[] levelOrder(TreeNode root) {
if(root == null)
return new int[0];
Queue<TreeNode> queue = new LinkedList<>();
ArrayList<Integer> arr = new ArrayList<>();
queue.offer(root);
while( !queue.isEmpty())
{
TreeNode temp = queue.peek();
if(temp.left != null)
queue.offer(temp.left);
if(temp.right != null)
queue.offer(temp.right);
arr.add(queue.poll().val);
}
int[] res = new int[arr.size()];
int i = 0;
for(int a : arr)
{
res[i++] = a;
}
return res;
}
}
3.总结思路及实现
如上
4.相关知识
-Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常