题目描述
描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围: 0≤n≤1500,树上每个节点的val满足 |val| <= 1500∣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.*;
/*
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>> rs = new ArrayList<>();
if(pRoot==null){
return rs;
}
Queue<TreeNode> q = new LinkedList<>();
q.add(pRoot);
//在这里设置一个标志量(flag)用于调整打印的顺序,在以下的程序中体现
boolean flag = true;
while(!q.isEmpty()){
ArrayList<Integer> row = new ArrayList<>();
int n=q.size();
flag = !flag;
for(int i=0;i<n;i++){
TreeNode cur= q.poll();
row.add(cur.val);
if(cur.left!=null){
q.add(cur.left);
}
if(cur.right!=null){
q.add(cur.right);
}
}
if(flag){
//工具类方法进行反转(调整顺序)
Collections.reverse(row);
}
rs.add(row);
}
return rs;
}
}