题目描述:
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路:
主要的方法与BFS写法没什么区别
BFS里是每次只取一个,而我们这里先得到队列长度size,这个size就是这一层的节点个数,然后通过for循环去poll出这size个节点,这里和按行取值二叉树返回ArrayList<ArrayList>这种题型的解法一样,核心思路为 list.add(index, T): 将元素插入index位置,index索引后的元素依次后移,这就完成了每一行元素的倒序,或者使用Collection.reverse()方法倒序也可以
代码描述:
import java.util.ArrayList;
import java.util.LinkedList;
/*
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<>();
LinkedList<TreeNode> res = new LinkedList<>();
res.add(pRoot);
boolean flag = true;
while(!res.isEmpty()){
int size = res.size();
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < size; i++){
TreeNode node = res.poll();
if(node == null){
continue;
}
if(flag){
list.add(node.val);
}else{
list.add(0, node.val);
}
res.offer(node.left);
res.offer(node.right);
}
if(list.size() != 0){result.add(list);}
flag = !flag;
}
return result;
}
}