题目
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围: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]]
解答
源代码
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return int整型ArrayList<ArrayList<>>
*/
public ArrayList<ArrayList<Integer>> Print (TreeNode pRoot) {
// write code here
if (pRoot == null) {
return new ArrayList<ArrayList<Integer>>();
}
Deque<TreeNode> stack = new ArrayDeque<>();
stack.add(pRoot);
int depth = 0;
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
while (!stack.isEmpty()) {
depth++;
int length = stack.size();
Deque<Integer> temp = new ArrayDeque<>();
while (length-- > 0) {
TreeNode node = stack.pollFirst();
if (node.left != null) {
stack.offerLast(node.left);
}
if (node.right != null) {
stack.offerLast(node.right);
}
temp.offerLast(node.val);
}
ArrayList<Integer> floor = new ArrayList<>();
if (depth % 2 == 1) {
while (!temp.isEmpty()) {
floor.add(temp.pollFirst());
}
res.add(floor);
} else {
while (!temp.isEmpty()) {
floor.add(temp.pollLast());
}
res.add(floor);
}
}
return res;
}
}
总结
广度优先遍历二叉树,用队列存储结点。把每一层的结点用双端队列保存起来,如果是奇数层就顺序记录结果,如果是偶数层就倒序记录结果。