题目要求如下:
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]
]
大体的要求跟102差不多,只不过是每层的结点值的顺序要按照Z字形(即第一行从左到右,第二行从右到左,第三行又从左到右……)。
一.我的解法
因为只需要改变顺序,所以我的解法还是跟102差不多,只是多加了一个布尔变量来判定当前的层次的值顺序是从左往右还是从右往左。时间复杂度是O(n),空间复杂度也是O(n)。
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if(root==null) return new ArrayList<>();
List<List<Integer>> res=new ArrayList<>();
Queue<TreeNode> queue=new LinkedList<>();
boolean zigzag=false;
queue.offer(root);
int len=0;
while(!queue.isEmpty()){
List<Integer> ls=new ArrayList<>();
len=queue.size();
for(int i=0;i<len;i++){
TreeNode node=queue.poll();
if(node.left!=null)
queue.offer(node.left);
if(node.right!=null)
queue.offer(node.right);
if(zigzag)
ls.add(0,node.val);
else
ls.add(node.val);
}
res.add(new ArrayList<Integer>(ls));
zigzag=!zigzag;
}
return res;
}
}
二.扩展
因为之前102的题目里我发现还有DFS的解法,所以我觉得这道题也必然可以用DFS解决,所以一开始还是打算用布尔变量进行判断是否改变结点值在列表的顺序,后来经过几次失败后,才发现这个方法对DFS遍历是不适用的,因为DFS遍历无法确定一个层级是否遍历完成,所以参考了discussion的解法后才发现还可以利用height%2的余数是否为0来判断。很直接,很简单,可惜一开始我没想到。时间复杂度O(n)。
class Solution{
List<List<Integer>> res=new ArrayList<>();
public List<List<Integer>> zigzagLevelOrder(TreeNode root){
if(root==null) return new ArrayList<>();
dfs(root,0);
return res;
}
public void dfs(TreeNode root,int height){
if(root==null) return ;
addList(root.val,height);
dfs(root.left,height+1);
dfs(root.right,height+1);
}
public void addList(int val,int height){
List<Integer> ls;
if(height>=res.size())
{
res.add(new ArrayList<Integer>());
}
ls=res.get(height);
if(height%2!=0)
ls.add(0,val);
else
ls.add(val);
}
}
这是原地址:
https://discuss.leetcode.com/topic/3413/my-accepted-java-solution
本人还是个菜鸡,所以肯定有错误或者不足的地方,请大家积极指出,我会认真改进的。