题解 | #按之字形顺序打印二叉树#
按之字形顺序打印二叉树
http://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0
O(N), O(N)
同层序遍历的方法,但是不同的是顺序交替,只能通过别的容器辅助完成,这里选栈,如果继续选择队列,从右到左时,不能辅助完成。通过mark变量标记遍历顺序
代码中,对于二叉树中的每个节点,都会进栈出栈,进队列出队列,所以4N时间,空间即为2N.满足时间和空间复杂度
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
//栈和队列的混合运用
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if(pRoot == null) return res;
Queue<TreeNode> queue= new LinkedList<>();
queue.add(pRoot);
int mark = 1;//标记,第一层从左到右
while(!queue.isEmpty()){
int size = queue.size();
ArrayList<Integer> tmp = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();//过渡作用
while(size -- > 0){
TreeNode node = queue.poll();
tmp.add(node.val);
if(mark % 2 == 0){//左到右
if(node.right != null) stack.push(node.right);
if(node.left != null) stack.push(node.left);
}else{//右到左
if(node.left != null) stack.push(node.left);
if(node.right != null) stack.push(node.right);
}
}
while(!stack.empty()){//转移至队列中
queue.add(stack.pop());
}
mark++;
res.add(tmp);
}
return res;
}
}