描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围:0 \le n \le 15000≤n≤1500,树上每个节点的val满足 |val| <= 1500∣val∣<=1500
要求:空间复杂度:O(n)O(n),时间复杂度: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>> result = new ArrayList<>();
if(pRoot == null) {
return result;
}
LinkedList<TreeNode> linkedList = new LinkedList<>();
linkedList.add(pRoot);
int j=0;
while (!linkedList.isEmpty()) {
int size = linkedList.size();
ArrayList<Integer> temp = new ArrayList<>();
for (int i=0;i<size;i++) {
TreeNode node = linkedList.poll();
if (node != null) {
temp.add(node.val);
if (node.left != null) {
linkedList.add(node.left);
}
if (node.right != null) {
linkedList.add(node.right);
}
}
}
//如果是奇数层,则将temp中的元素反转
if (j%2==1) {
Collections.reverse(temp);
}
result.add(temp);
j++;
}
return result;
}
}