又是一道Level Order Traversal的变型题,可见能熟练写出Level Order Traversal是很必须的!
package Level4; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.Queue; import Utility.TreeNode; /** * Binary Tree Zigzag Level Order Traversal * * 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,#,#,15,7}, 3 / \ 9 20 / \ 15 7 return its zigzag level order traversal as: [ [3], [20,9], [15,7] ] confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ. OJ's Binary Tree Serialization: The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below. Here's an example: 1 / \ 2 3 / 4 \ 5 The above binary tree is serialized as "{1,2,3,#,#,4,#,#,5}". */ public class S103 { public static void main(String[] args) { } public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) { ArrayList<ArrayList<Integer>> ret = new ArrayList<ArrayList<Integer>>(); if(root == null){ return ret; } Queue<TreeNode> queue = new LinkedList<TreeNode>(); ArrayList<Integer> al = new ArrayList<Integer>(); queue.add(root); int currentLevel = 1; int nextLevel = 0; boolean left = true; while(!queue.isEmpty()){ TreeNode cur = queue.remove(); currentLevel--; al.add(cur.val); if(cur.left != null){ queue.add(cur.left); nextLevel++; } if(cur.right!=null){ queue.add(cur.right); nextLevel++; } if(currentLevel == 0){ if(!left){ // 当自右往左时,要翻转al Collections.reverse(al); } left = !left; ret.add(al); al = new ArrayList<Integer>(); currentLevel = nextLevel; nextLevel = 0; } } return ret; } }
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> ret = new ArrayList<List<Integer>>(); if(root == null) { return ret; } LinkedList<TreeNode> queue = new LinkedList<TreeNode>(); queue.add(root); int curLevelCnt = 1; int nextLevelCnt = 0; List<Integer> list = new ArrayList<Integer>(); boolean order = true; while(!queue.isEmpty()) { TreeNode cur = queue.remove(); list.add(cur.val); curLevelCnt--; if(cur.left != null) { queue.add(cur.left); nextLevelCnt++; } if(cur.right != null) { queue.add(cur.right); nextLevelCnt++; } if(curLevelCnt == 0) { curLevelCnt = nextLevelCnt; nextLevelCnt = 0; if(!order) { Collections.reverse(list); } order = !order; ret.add(new ArrayList(list)); list.clear(); } } return ret; } }