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] ]
哎,这题当时没刷过...
一开始想着一层用queue,一层用stack。发现这样不大对。从网上看到了一个有创意的解法:其实还是一个类似队列的操作,每次往队列里放也是先坐儿子后右儿子。只不过在奇数行的时候不插到队尾,而是往队列头插入。
public class Solution {
public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(root == null)
return result;
search(root, 0, result);
return result;
}
public void search(TreeNode node, int depth, ArrayList<ArrayList<Integer>> result){
if(node == null)
return;
ArrayList<Integer> currentLevel = null;
if(depth == result.size()){
currentLevel = new ArrayList<Integer>();
result.add(currentLevel);
}
else{
currentLevel = result.get(depth);
}
//insert into the end of the list if the current depth is even
//to the beginning of the list if the depth is odd
if(depth % 2 == 0)
currentLevel.add(node.val);
else
currentLevel.add(0, node.val);
search(node.left, depth + 1, result);
search(node.right, depth + 1, result);
}
}
另外还可以用两个stack来进行traversal,具体的解法在 这里。感觉不用递归还是挺不错的