题目: 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
函数定义为public int[] levelOrder(TreeNode root)
,
分析
由题意可知需要层序遍历二叉树,将树节点的val值存入int[]数组内。此时即使二叉树不是满二叉树,为空的树节点也不会影响结果的输出,同时根据28题的思路,初始化一个队列,将根节点入队列,当队列不为空时,依次出队列,同时保存val值,同时将出队列的节点的非空子节点入队列。
在写代码的过程中才发现由于树节点个数不知,数组初始化时未知数组长度(倒是也可以初始化数组长度是1000,但明显造成了空间浪费),而若初始化为null
,在使用的时候会报java.lang.NullPointerException
,所以无法直接初始化int[]
。解决办法是先定义集合,最后集合转数组,常用的是ArrayList
。
代码
public int[] levelOrder(TreeNode root) {
if(root==null) return new int[0];
List<Integer> list = new ArrayList<Integer>();
Queue<TreeNode> queue = new LinkedList<TreeNode>();
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 length = list.size();
int[] array = new int[length];
for(int i=0;i<length;i++) {
array[i] = list.get(i);
}
return array;
}
- 时间复杂度:O(N),N为二叉树的节点数
- 空间复杂度:O(N),最差情况下,有N/2个节点在队列里(即为平衡二叉树时)。