题目描述:
这道题和之前的差不多,这里只是需要改一下每次放入的顺序,即换一个就reverse,即可,比较简单
代码如下:
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result = new LinkedList();
Queue<TreeNode> temqueue = new LinkedList<>();
if(root == null){
return result;
}
temqueue.add(root);
// 使用flag用来指定从左往右还是从右往左
boolean flag = false;
while (!temqueue.isEmpty()) {
int size = temqueue.size();
List<Integer> tem = new ArrayList<>();
for (int i = 0; i < size; i++) {
TreeNode sNode = temqueue.poll();
tem.add(sNode.val);
if(sNode.left != null){
temqueue.offer(sNode.left);
}
if(sNode.right != null){
temqueue.offer(sNode.right);
}
}
if(flag){
Collections.reverse(tem);
}
flag = !flag;
result.add(tem);
}
return result;
}
}
当然也可以用之前的哪个深度遍历的递归,代码如下
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
dfs(root, 0, res);
return res;
}
private void dfs(TreeNode node, int l, List<List<Integer>> res) {
if (node != null) {
if (l == res.size()) {
List<Integer> level = new ArrayList<>();
res.add(level);
}
//利用list添加元素的特性来解决问题:过于trick了,还有用单队列双向出队的特性。。
if (l % 2 == 1) {
res.get(l).add(0, node.val); // insert at the beginning
} else {
res.get(l).add(node.val);
}
dfs(node.left, l+1, res);
dfs(node.right, l+1, res);
}
}
}