102. 二叉树的层序遍历
二叉树层序遍历可以借助BFS的思想解决:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
}
}
拿到这个题目之后,首先看到返回的类型是一个List<List<Integer>>
,因此在构造返回结果的时候,结果也是按层进行添加的,也就是说,在处理的过程中需要保存当前访问的层。
// 构造返回结果
List<List<Integer>> res = new LinkedList<List<Integer>>();
// 动态添加值
List<Integer> list = new LinkedList<>();
res.add(list);
其次,为了达到层次遍历的效果,可以把二叉树的依次按层节点压入到队列中,再依次弹出使用:
Queue<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode node = queue.poll();
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
可以说,队列一次性保存了二叉树某个层的全部节点,一层一层的直到最底层:
public class Solution {
// 迭代
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new LinkedList<List<Integer>>();
if(root == null) return res;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while (!queue.isEmpty()){
List<Integer> list = new LinkedList<>();
int level_length = queue.size();
for (int i = 0; i < level_length; i++) {
TreeNode node = queue.poll();
list.add(node.val);
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}
res.add(list);
}
return res;
}
}
107. 二叉树的层次遍历 II
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
和上一题的唯一区别就是:每层的结点在结果中存放的先后顺序不同
稍微调整一下代码:
res.add(0, list);
剑指 Offer 32 - III. 从上到下打印二叉树 III
请实现一个函数按照之字形顺序打印二叉树
通过奇偶层的分离,就可以实现之字形打印的。在层序遍历中,res按层保存了遍历的结果,因此可以借助res.size
来区分奇偶层,也可以在循环外单独设置一个变量来指示当前的层数:
public class Solution {
// 迭代
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new LinkedList<List<Integer>>();
if(root == null) return res;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
int level = 0;
while (!queue.isEmpty()){
List<Integer> list = new LinkedList<>();
int level_length = queue.size();
for (int i = 0; i < level_length; i++) {
TreeNode node = queue.poll();
if (level % 2 == 0) list.add(node.val);
else list.add(0, node.val);
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}
res.add(list);
level ++;
}
return res;
}
}