1 解题思想
首先这道题和
Leetcode 102. Binary Tree Level Order Traversal 二叉树按层遍历 解题报告
很接近,Zigzag同样是按层遍历,但是区别是对于高度为奇数(从0开始计数的话,则是第1 3 5 7)的层,当层的遍历需要反过来。
做法:
1、采用102题目中的方式,无论是DFS还是BFS都行
2、完成1后,对所有奇数层进行翻转
这题的写法和102不太相同,大家都可以参考
2 原题
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15
3 AC解
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
/**
* 采用广度遍历BFS的方式,在维护访问队列的同时维护一个层数的队列
* 当层数发生改变时,将当层的结果加入到结果集当中,此时看层数,如果层数是奇数(从0开始),则先翻转再加入就可以
*/
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(root==null) return result;
Queue<Integer> layers = new LinkedList<Integer>();
Queue<TreeNode> nodes = new LinkedList<TreeNode>();
nodes.add(root);
layers.add(0);
int lastLayer = 0;
List<Integer> tmp = new ArrayList<Integer>();
TreeNode node = null;
int layer = 0;
while(nodes.isEmpty() == false){
node = nodes.poll();
layer = layers.poll();
if(layer != lastLayer){
if(lastLayer %2 == 1){
Collections.reverse(tmp);
}
result.add(tmp);
tmp = new ArrayList<Integer>();
}
tmp.add(node.val);
lastLayer = layer;
if(node.left != null) {
nodes.add(node.left);
layers.add(layer+1);
}
if(node.right != null) {
nodes.add(node.right);
layers.add(layer+1);
}
}
if(lastLayer %2 == 1){
Collections.reverse(tmp);
}
result.add(tmp);
return result;
}
}