您的位置:首页 > 其它

LeetCode Binary Tree Zigzag Level Order Traversal

2015-08-21 07:48 459 查看
原题链接在这里:https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/

这道题是BFS的变形,与Binary Tree Level Order Traversal相似。但是要求偶数行从左到右,奇数行从右到左。

这种顺序正反交替可以用两个stack来实现。一个用来读取,一个用来存储下一层节点。

Time O(n), Space O(n).

Note: 1. 内层loop表示一行,每当一行走完,stk就会变为空,stk需更新成newStk. 外层loop是走完整个树。所以level不要忘记在外层loop更新。

2. 只有当ls.size()>0时,外层loop才会把ls加到res里,如果没有这个限定条件的话会在最后加上一个空的ls到res里。

AC Java:

/**
* 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) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if(root == null){
return res;
}
List<Integer> ls = new ArrayList<Integer>();
Stack<TreeNode> stk = new Stack<TreeNode>();
stk.push(root);
ls.add(root.val);
res.add(ls);
int level = 1;
while(!stk.empty()){
Stack<TreeNode> newStk = new Stack<TreeNode>();
ls = new ArrayList<Integer>();

while(!stk.empty()){
TreeNode tn = stk.pop();
if(level%2 == 0){
if(tn.left != null){
ls.add(tn.left.val);
newStk.push(tn.left);
}
if(tn.right != null){
ls.add(tn.right.val);
newStk.push(tn.right);
}
}else{
if(tn.right != null){
ls.add(tn.right.val);
newStk.push(tn.right);
}
if(tn.left != null){
ls.add(tn.left.val);
newStk.push(tn.left);
}
}
}
level++;
if(ls.size()>0){ //error
res.add(ls);
}
stk = newStk;
}
return res;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: