题目
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
提示:
节点总数 <= 1000
代码
是不熟悉的二叉树! 没事这回我们把它干碎!
这道题拿到手我的第一思路是用一个flag来表示它所处的层级, 然后根据flag来分链进行表示,
然后感觉现在这样来的更快(指队列
队列先进先出的特性太适合这样按顺序打印二叉树了
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
if (root == null) {
return ans;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int flag = 0;
while (!queue.isEmpty()) {
//一定要在循环内定义新的链表....不然后果你试试呗(x
//把上一次添加后的链表清楚后..就算添加进去了..也会被归零
List<Integer> list = new ArrayList<>();
//来!循环!
//这种先根据queue.size()的循环 不会因为因为出队列进队列而改变大小
//这样每一层都会输出每一层应有的个数(这一层输出的个数是上一层加入队列的大小所决定的
for (int i = queue.size(); i > 0; i--) {
TreeNode temp = queue.poll();
list.add(temp.val);
if (temp.left != null) {
queue.add(temp.left);
}
if (temp.right != null) {
queue.add(temp.right);
}
}
//如果是奇数层那就反转一下咯~有什么办法勒
if (flag++ % 2 == 1){
ans.add(reverse(list));
}else{
//不是奇数层那不就直接莽上去
ans.add(list);
}
}
return ans;
}
//用于反转的方法! 好像没什么需要特别主义的点(
public static List<Integer> reverse(List<Integer> list) {
int[] a = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
a[i] = list.get(i);
}
for (int j = list.size() - 1, i = 0; j >= 0; j--, i++) {
list.set(i, a[j]);
}
return list;
}
}