问题
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例子
思路
-
方法1
使用队列,先按从上到下的顺序逐行打印,然后把下标为奇数的行都翻转
-
方法2
使用dfs【正常的层次遍历不能用】,保存一个参数level,如果level为奇数,说明需要翻转则头插【每次插在下标0】,否则尾插
代码
//方法1
class Solution {
public void reverse(List<Integer> t){
int i=0,j=t.size()-1;
while(i<j) {
int a = t.get(i);
t.set(i,t.get(j));
t.set(j,a);
i++;
j--;
}
}
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
if(root==null) return list;
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while(q.size()>0) {
int len = q.size();
List<Integer> temp = new ArrayList<>();
for(int i=0; i<len; i++) {
TreeNode node = q.poll();
temp.add(node.val);
if(node.left!=null) q.offer(node.left);
if(node.right!=null) q.offer(node.right);
}
list.add(temp);
}
for(int i=0; i<list.size(); i++) {
if(i%2==1) {
List<Integer> t = list.get(i);
reverse(t);
}
}
return list;
}
}
//方法2
class Solution {
public void reverse(List<Integer> t){
int i=0,j=t.size()-1;
while(i<j) {
int a = t.get(i);
t.set(i,t.get(j));
t.set(j,a);
i++;
j--;
}
}
public void dfs(List<List<Integer>> list, TreeNode root, int level) {
if(root==null) return;
if(list.size()==level) list.add(new ArrayList<Integer>());
if(level%2==1) list.get(level).add(0,root.val);
else list.get(level).add(root.val);
dfs(list,root.left,level+1);
dfs(list,root.right,level+1);
}
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
if(root==null) return list;
dfs(list,root,0);
return list;
}
}