题目:把二叉树按之字形层序遍历,每层单独保存,最后返回。
public ArrayList<ArrayList> zigzagLevelOrder (TreeNode root)
思路:基本思路是层序遍历每层单独保存。这是用size固定,然后把每次size的元素放到一层中保存。
不同的是有正向的,有反向的。用一个栈,来实现反向的。(就是先放到栈里,再拿出来保存)。
用栈,不会增加时间和空间的复杂度。(时间上语句没有嵌套,而且需要使用队列)
/*
隔行打印层序遍历,用size保存
之字形,需要反过来的就放栈里面,复杂度都不会变
还有用arrayList.add(0,item)来实现反向插入,但是需要移动时间复杂度高
就不用这个了。就用栈来进行反向操作。
*/
public ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) {
LinkedList<TreeNode> queue = new LinkedList<>();
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
//之字形需要反过来的时候用
Stack<Integer> stack = new Stack<>();
if(root == null) return res;
queue.add(root);
//是否需要反过来(是否需要中间放到栈里)
boolean inverted = false;
while(!queue.isEmpty()){
//每次resList都是新的
ArrayList<Integer> resList = new ArrayList<>();
//size要提前固定下来
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode temp = queue.poll();
if(inverted){
stack.push(temp.val);
}else{
resList.add(temp.val);
}
if(temp.left != null) queue.add(temp.left);
if(temp.right != null) queue.add(temp.right);
}
if(inverted){
while(!stack.isEmpty()){
resList.add(stack.pop());
}
inverted = false;
}else{
inverted = true;
}
res.add(resList);
}
return res;
}