思路
- 同上一题的思路,层序遍历+队列确认长度遍历
- 相对上一题多了一个奇偶判断,选择左/右顺序输出,通过数组头插法或者尾插法就可以实现调整输出顺序
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> matrix = new ArrayList();
scanTree(root,matrix);
return matrix;
}
public void scanTree(TreeNode node, List<List<Integer>> matrix) {
if (node == null) return;
Queue<TreeNode> queue = new LinkedList();
queue.add(node);
// 记录处理的层数
int row = 0;
// 外层循环,每次处理一层
while (!queue.isEmpty()) {
// 上一层的数量
int len = queue.size();
LinkedList<Integer> level = new LinkedList();
for(int i = 0; i < len ; i++) {
TreeNode n = queue.poll();
if (row % 2 == 0) {
// 如果偶数,从左到右,使用尾插法
level.offerLast(n.val);
} else {
// 如果奇数,从右到左,使用头插法
level.offerFirst(n.val);
}
if (n.left != null) queue.add(n.left);
if (n.right != null) queue.add(n.right);
}
row = row + 1;
matrix.add(level);
}
}
}
Q.E.D.