Question
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]
]
本题难度Medium。迭代法用队列实现,递归法可以用栈和队列分别实现。
1、迭代+队列
【复杂度】
时间 O(b^(h+1)-1) 空间 O(b^h)
【思路】
与[LeetCode]Binary Tree Level Order Traversal差不多,区别点就在于向list
加入n.val
的方式:
- 如果层序
level
为偶数,逆序加入 - 如果层序
level
为奇数,顺序加入
【代码】
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
//require
List<List<Integer>> ans=new LinkedList<>();
Queue<TreeNode> q=new LinkedList<>();
if(root!=null)q.add(root);
int level=1;
//invariant
while(!q.isEmpty()){
List<Integer> list=new LinkedList<>();
int size=q.size();
for(int i=0;i<size;i++){
TreeNode n=q.remove();
if(level%2==0)
list.add(0,n.val);
else
list.add(n.val);
if(n.left!=null)q.add(n.left);
if(n.right!=null)q.add(n.right);
}
ans.add(list);
level++;
}
//ensure
return ans;
}
}
2、栈+递归
【复杂度】
时间 O(b^(h+1)-1) 空间 O(b^h)
【思路】
根据层序进行区分:
- 如果层序
level
为奇数,节点的儿子先左儿子后右儿子入栈 - 如果层序
level
为偶数,节点的儿子先右儿子后左儿子入栈
【代码】
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
//require
List<List<Integer>> ans=new LinkedList<>();
Stack<TreeNode> stack=new Stack<>();
if(root!=null)stack.push(root);
//invariant
helper(stack,1,ans);
//ensure
return ans;
}
public void helper(Stack<TreeNode> stack,int level,List<List<Integer>> ans){
//base case
if(stack.isEmpty())
return;
Stack<TreeNode> nextStack=new Stack<>();
List<Integer> list=new LinkedList<>();
while(!stack.isEmpty()){
TreeNode n=stack.pop();
list.add(n.val);
if(level%2==0){
if(n.right!=null)nextStack.push(n.right);
if(n.left!=null)nextStack.push(n.left);
}else{
if(n.left!=null)nextStack.push(n.left);
if(n.right!=null)nextStack.push(n.right);
}
}
ans.add(list);
helper(nextStack,level+1,ans);
}
}