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]
]
这题实际上是要现在Z形打印树的结构,具体方法是使用两个stack,由于stack是先入后出的,一个为cur,一个为next,stack(cur)先存入root,然后循环,取stack(cur).pop(),当cur==0时候,将stack(cur).pop()的子节点从左到右压入stack(next)中,当cur==1时候,stack(cur).pop()的子节点从右往左压入stack(next),当每遍历一次stack(cur)时候,互相改变cur和next的值。具体代码如下:
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> ret=new ArrayList<List<Integer>>();
if(root==null) return ret;
int cur=0;
int next=1;
ArrayList<Stack<TreeNode>>list=new ArrayList<>();
list.add(new Stack<TreeNode>());
list.add(new Stack<TreeNode>());
list.get(cur).add(root);
while (!list.get(cur).isEmpty()||!list.get(next).isEmpty()) {
List<Integer> list2=new ArrayList<Integer>();
while (!list.get(cur).isEmpty()) {
TreeNode temp=list.get(cur).pop();
list2.add(temp.val);
if (cur==0) {
if (temp.left!=null) {
list.get(next).add(temp.left);
}
if (temp.right!=null) {
list.get(next).add(temp.right);
}
}else {
if (temp.right!=null) {
list.get(next).add(temp.right);
}
if (temp.left!=null) {
list.get(next).add(temp.left);
}
}
}
if (list.get(cur).isEmpty()) {
ret.add(list2);
cur=1-cur;
next=1-next;
}
}
return ret;
}