牛客试题:按之字形顺序打印二叉树
描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围:15000≤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.*;
/*
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>> res = new ArrayList<>();
if(pRoot == null) return res;
//BFS老工具人了,队列
Queue<TreeNode> queue = new ArrayDeque<>();
//先加入根节点
queue.offer(pRoot);
int cnt = 0;//用于判断哪些层需要反转
//BFS开始
while (!queue.isEmpty()){
cnt++;//记录了当前层
//弹出当前层的元素
int sz = queue.size();
ArrayList<Integer> list = new ArrayList<>();
//开始遍历这一层的元素
for (int i = 0; i < sz; i++) {
TreeNode temp = queue.poll();
//添加该层元素值
list.add(temp.val);
//添加该节点对应的下一层的元素
if(temp.left!=null) queue.offer(temp.left);
if(temp.right!=null) queue.offer(temp.right);
}
//判断是否需要反序
if(cnt%2==0){
Collections.reverse(list);
}
res.add(list);
}
return res;
}
}