0
点赞
收藏
分享

微信扫一扫

[LeetCode]Binary Tree Zigzag Level Order Traversal


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​​的方式:

  1. 如果层序​​level​​为偶数,逆序加入
  2. 如果层序​​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)

【思路】
根据层序进行区分:

  1. 如果层序​​level​​为奇数,节点的儿子先左儿子后右儿子入栈
  2. 如果层序​​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);
}
}


举报

相关推荐

0 条评论