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] ]
运用栈的先进先出特点,并保证每层元素进栈的顺序是从左向右,或者从右向左
public class Solution { public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) { ArrayList<Integer> ai = new ArrayList<Integer>(); ArrayList<ArrayList<Integer>> re = new ArrayList<ArrayList<Integer>>(); if(root==null) return re; Stack<TreeNode> stack = new Stack<TreeNode>(); Stack<TreeNode> tempStack = new Stack<TreeNode>(); stack.push(root); int i=0; while(!stack.isEmpty()){ TreeNode tempnode = stack.peek(); stack.pop(); ai.add(tempnode.val); //根据层序的层数来确定是从左向右添加还是从右向左添加 //保证stack中的顺序是连续的 if(i%2==0){ if(tempnode.left!=null){ tempStack.push(tempnode.left); } if(tempnode.right!=null){ tempStack.push(tempnode.right); } }else{ if(tempnode.right!=null){ tempStack.push(tempnode.right); } if(tempnode.left!=null){ tempStack.push(tempnode.left); } } if(stack.isEmpty()){ i++; stack=tempStack; tempStack = new Stack<TreeNode>(); re.add(ai); ai=new ArrayList<Integer>(); } } return re; } }