1. 从上到下打印二叉树 III
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7返回其层次遍历结果:[[3],[20,9],[15,7]]
思路:
- 在II的基础上,添加一个验证,如果为true执行从右向左打印,如果为false执行从左向右打印。
- 从右向左的打印,可以将当前一层的节点全部压入栈中,利用栈的结构特点(先进后出)实现出栈的逆序,进而实现逆向打印。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
if(root!=null) queue.add(root);
boolean flag = false;
while(!queue.isEmpty()){
List<Integer> temp = new ArrayList<>();
if(flag){
Stack<TreeNode> stack = new Stack<>();
for(int i=queue.size();i>0;i--){
TreeNode cur = queue.poll();
stack.push(cur);
if(cur.left!=null) queue.add(cur.left);
if(cur.right!=null) queue.add(cur.right);
}
while(!stack.isEmpty()){
TreeNode cur = stack.pop();
temp.add(cur.val);
}
res.add(temp);
flag = !flag;
}else{ // 从左到右
for(int i=queue.size();i>0;i--){
TreeNode cur = queue.poll();
temp.add(cur.val);
if(cur.left!=null) queue.add(cur.left);
if(cur.right!=null) queue.add(cur.right);
}
res.add(temp);
flag = !flag;
}
}
return res;
}
}
