描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围:0≤n≤1500,树上每个节点的val满足∣val∣<=1500
要求:空间复杂度:O(n),时间复杂度:O(n)
例如:
给定的二叉树是{1,2,3,#,#,4,5}

该二叉树之字形层序遍历的结果是
[
[1],
[3,2],
[4,5]
]
示例1
输入:{1,2,3,#,#,4,5}
返回值:[[1],[3,2],[4,5]]
说明:
如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。
示例2
输入:{8,6,10,5,7,9,11}
返回值:[[8],[10,6],[5,7,9,11]]
示例3
输入:{1,2,3,4,5}
返回值:[[1],[3,2],[4,5]]
牛客
利用队列层次遍历的方式,奇数为左到右,偶数为右到左。
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > result = new ArrayList<>();
Queue<TreeNode> q1 = new LinkedList<>();
if(pRoot == null) return result;
q1.offer(pRoot);
int count = 1;
while(!q1.isEmpty()){
int n = q1.size();
ArrayList<Integer> res= new ArrayList<>();
for(int i = 0 ;i<n;i++){
TreeNode node = q1.poll();
res.add(node.val);
if(node.left!=null) q1.offer(node.left);
if(node.right!=null) q1.offer(node.right);
}
if(count%2 == 0){
for(int i = 0,j = res.size()-1;i<j;i++,j--){
int swap = res.get(i);
res.set(i,res.get(j));
res.set(j,swap);
}
}
result.add(res);
count++;
}
return result;
}
}
翻转可用Collections.reverse(array);
方法二:双栈法:一个栈放奇数,一个栈放偶数。