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] ]
跟层序遍历那道题差不多
Source
/**
* 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>> st = new ArrayList<List<Integer>>();
List<Integer> val = new ArrayList<Integer>();
LinkedList<TreeNode> l = new LinkedList<TreeNode>(); //注意定义为TreeNode型
if(root == null) return st;
l.add(root);
int cur = 1;
int next = 0;
boolean flag = true;
while(!l.isEmpty()){ //判空
TreeNode temp = l.poll();
cur --;
if(flag == true) //与层序遍历那道题的区别就在于输出方式
val.add(temp.val);
else val.add(0,temp.val);
if(temp.left != null){
l.add(temp.left);
next ++;
}
if(temp.right != null){
l.add(temp.right);
next ++;
}
if(cur == 0){
cur = next;
next = 0;
st.add(val);
flag = !flag;
val = new ArrayList<Integer>();
}
}
return st;
}
}
Test
public static void main(String[] args){
TreeNode a = new TreeNode(1);
a.left = new TreeNode(2);
a.right = new TreeNode(3);
a.left.left = new TreeNode(4);
a.left.right = new TreeNode(5);
a.right.left = new TreeNode(6);
a.right.right = new TreeNode(7);
a.left.left.left = new TreeNode(8);
a.left.left.right = new TreeNode(9);
a.right.left.left = new TreeNode(10);
a.right.left.right = new TreeNode(11);
a.left.left.left.left = new TreeNode(12);
a.left.left.right.left = new TreeNode(13);
a.right.left.left.left = new TreeNode(14);
a.right.left.right.left = new TreeNode(15);
System.out.println(new Solution().zigzagLevelOrder(a));
}