描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围:0 \le n \le 15000≤n≤1500,树上每个节点的val满足 |val| <= 1500∣val∣<=1500
要求:空间复杂度:O(n)O(n),时间复杂度:O(n)O(n)
该二叉树之字形层序遍历的结果是
[
[1],
[3,2],
[4,5]
]
思路:
生成一个队列 q 按照层次遍历入队出队
生成一个row 可变数组,存储树的每一层 节点
因为需要“之”字行所以
偶数层(0,2,4...) q出队,直接插入row即可
奇数层(1,3,5...) 先把数据从队列取出到一个 stack 中,然后stack 出栈存入row。
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
import java.util.Stack;
/*
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> q=new LinkedList<>();
TreeNode tmp;
int layer=0;
if(pRoot==null) {
return result;
}
q.add(pRoot);
while(!q.isEmpty()){
ArrayList<Integer> row=new ArrayList<>();
int size=q.size();
Stack<TreeNode> s=new Stack<>();
// 入队还是正常入队,但是入row 需要颠倒或者正常
for(int i=0;i<size;i++){
tmp=q.poll();
if(layer %2 ==0){//偶数正常添加到row
row.add(tmp.val);//添加第i层
}else{//奇数需要栈
s.push(tmp);
}
if(tmp.left != null){
q.add(tmp.left);
}
if(tmp.right != null){
q.add(tmp.right);
}
}
//现在队伍里是i+1 层
while(!s.isEmpty()){//用栈添加
tmp=s.pop();
row.add(tmp.val);
}
layer++;
result.add(row);
}
return result;
}
}