题目:
Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).
解答:
解法一:
这道题为二叉树的层级遍历
借助ArrayList,实现了层级遍历,具体思路为:
- 创建 list,用于存储当前遍历层的节点
- 创建 nextlist,用于存储下一层的节点。同时创建 curlist,用于存储当前遍历层节点的值。(在遍历当前层节点,寻找下一层节点时,可以同时将当前节点的 val 值存储 curnext 中,便于后续直接存入 res 中)
- 遍历当前节点即 list 中节点,将下一层节点写入 nextlist,并将当前节点值写入 curlist
- 令 list = nextlist,继续遍历
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if(root == null) {
return res;
}
List<TreeNode> list = new ArrayList<>();
list.add(root);
while(!list.isEmpty()) {
List<Integer> curlist = new ArrayList<>();
List<TreeNode> nextlist = new ArrayList<>();
for(TreeNode node: list) {
curlist.add(node.val);
if(node.left != null) {
nextlist.add(node.left);
}
if(node.right != null) {
nextlist.add(node.right);
}
}
res.add(curlist);
list = nextlist;
}
return res;
}
}
解法二:队列
层级遍历也可以借助队列实现,与上述解法思路基本一致。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if(root == null) {
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()) {
List<Integer> list = new ArrayList<>();
int count = queue.size();
for(int i=0; i<count; 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;
}
}
要注意两点:
- 上述代码中,在遍历下一层节点时,要先用 count 记录下层中的节点数,然后在遍历。刚开始没注意,没有采用 count 存储,而是直接 for(int i=0; i<queue.size(); i++),会导致错误,因为在遍历时节点会出队列,队列的长度会发生变化。
- 这里弹出队列中的元素时,要采用 poll() 方法,而不能采用 pop() 方法。虽然两个方法都是从队列头部取出元素并删除;,但区别在于,pop() 遇到 null 会报异常,而 poll() 遇到null 会返回 null