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,7] ]
思路:还是基于层次遍历,记录所在层次,判断是正向打印还是逆向打印。
/** * 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>> zigzagLevelOrder(TreeNode root) { Queue<TreeNode> q = new LinkedList<TreeNode>(); ArrayList<TreeNode> temp = new ArrayList<TreeNode>(); List<List<Integer>> ans = new ArrayList<List<Integer>>(); q.add(root); boolean towards = true;//true:l2r,false:r2l while(!q.isEmpty()){ List<Integer> result = new ArrayList<Integer>(); while(!q.isEmpty()){ TreeNode n = q.poll(); if( n == null ) continue; result.add(n.val); temp.add(n.left); temp.add(n.right); } if(towards){ if(result.size() > 0) ans.add(result); }else{ if(result.size() > 0){ Collections.reverse(result); ans.add(result); } } towards = !towards; if(temp.size() > 0) q.addAll(temp); temp.clear(); } return ans; } }
更简略写法:
/** * 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>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> sol = new ArrayList<>(); travel(root, sol, 0); return sol; } private void travel(TreeNode curr, List<List<Integer>> sol, int level) { if(curr == null) return; if(sol.size() <= level) sol.add(new LinkedList<>()); if(level % 2 == 0) sol.get(level).add(curr.val); else sol.get(level).add(0, curr.val); travel(curr.left, sol, level + 1); travel(curr.right, sol, level + 1); } }现在得加大题量了,所以博客就简记一下思路,不详细说了~