题目信息
示例1:
给定二叉树: [3,9,20,null,null,15,7]
,
返回其层次遍历结果:
1 2 3 4 5
| [ [3], [20,9], [15,7] ]
|
提示
解题思路
本题难点
二叉树层序遍历,每层遍历顺序都发生变化,奇数层逆序
具体思路
层序遍历 + 双端队列
- 操作:利用双端队列的两端皆可添加元素的特性,设打印列表(双端队列)
level
,并规定
- 奇数层 则添加至
level
尾部
- 偶数层 则添加至
level
头部
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class Solution { public List<List<Integer>> levelOrder(TreeNode root) { if(root == null){ return new ArrayList<>(0); } List<List<Integer>> res = new ArrayList<>(); Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); while(!queue.isEmpty()){ LinkedList<Integer> level = new LinkedList<>(); for(int i = queue.size(); i > 0; i--){ TreeNode node = queue.poll(); if(res.size() % 2 == 0){ level.addLast(node.val); }else{ level.addFirst(node.val); } if(node.left != null){ queue.add(node.left); } if(node.right != null){ queue.add(node.right); } } res.add(level); } return res; } }
|
复杂度分析:
- 时间复杂度 O(N) : N 为二叉树的节点数量,BFS 需循环 N 次,占用 O(N) ;双端队列的队首和队尾的添加和删除操作的时间复杂度均为 O(1) 。
- 空间复杂度 O(N) : 最差情况下,即当树为满二叉树时,最多有 N/2 个树节点 同时 在
queue
中,使用 O(N)大小的额外空间。
其他优秀解答
解题思路
一般在树相关的题目中都可以考虑递归解法
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| class Solution { List<List<Integer>> res = new ArrayList<>(); public List<List<Integer>> levelOrder(TreeNode root) { if(root == null){ return new ArrayList<>(0); } recur(root,0); return res; }
public void recur(TreeNode root,int k){ if(root != null){ if(res.size() <= k){ res.add(new ArrayList<>()); } if((k & 1) == 1){ res.get(k).add(0,root.val); }else{ res.get(k).add(root.val); } recur(root.left,k+1); recur(root.right,k+1); } } }
|