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
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]
]
Solution
We use a variant of BFS with two stacks, one for this level one for the next one. As we traverse one level we add the children into the next level stack, once a level is traversed the next level stack becomes the actual one.
/**
* 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>> solution = new ArrayList<List<Integer>>();
ArrayDeque<TreeNode> thisLevel = new ArrayDeque<TreeNode>();
boolean leftToRight = true;
if(root != null)
thisLevel.add(root);
while(!thisLevel.isEmpty())
{
List<Integer> level = new ArrayList<Integer>();
ArrayDeque<TreeNode> nextLevel = new ArrayDeque<TreeNode>();
while(!thisLevel.isEmpty())
{
TreeNode temp = thisLevel.pop();
level.add(temp.val);
if(leftToRight)
{
if(temp.left != null)
nextLevel.push(temp.left);
if(temp.right != null)
nextLevel.push(temp.right);
}
else
{
if(temp.right != null)
nextLevel.push(temp.right);
if(temp.left != null)
nextLevel.push(temp.left);
}
}
leftToRight = !leftToRight;
thisLevel = nextLevel;
solution.add(level);
}
return solution;
}
}
No comments :
Post a Comment