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 ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
Stack<TreeNode> s1 = new Stack<TreeNode>();
Stack<TreeNode> s2 = new Stack<TreeNode>();
if(root != null) s1.push(root);
while(!s1.isEmpty() || !s2.isEmpty()){
ArrayList<Integer> l = new ArrayList<Integer>();
while(!s1.isEmpty()){
TreeNode t = s1.pop();
l.add(t.val);
if(t.left != null) s2.push(t.left);//先左后右
if(t.right != null) s2.push(t.right);
}
if(l.size() > 0)
list.add(l);
//
l = new ArrayList<Integer>();
while(!s2.isEmpty()){
TreeNode t = s2.pop();
l.add(t.val);
if(t.right != null) s1.push(t.right);//注意要与s1的顺序相反,先右后左
if(t.left != null) s1.push(t.left);
}
if(l.size() > 0)
list.add(l);
}
return list;
}