您的位置:首页 > 其它

[LeetCode]Binary Tree Zigzag Level Order Traversal

2016-11-17 16:31 363 查看
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  遍历 leetcode