题目描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
求解思路
用队列queue保存访问的节点,先进先出。
补充知识
Java中的集合类的关系图:
本次题目用到的接口有List和Queue,具体的实现类分别是ArrayList和LinkedList。
ArrayList底层是用数组实现的,可以认为ArrayList是一个可改变大小的数组。随着越来越多的元素被添加到ArrayList中,其规模是动态增加的。
LinkedList底层是通过双向链表实现的。
所以,LinkedList和ArrayList之前的区别主要就是数组和链表的区别。LinkedList和ArrayList相比,增删的速度较快。但是查询和修改值的速度较慢。同时,LinkedList还实现了Queue接口,所以他还提供了offer(), peek(), poll()等方法。
代码
执行用时:1 ms, 在所有 Java 提交中击败了94.65%的用户
内存消耗:39 MB, 在所有 Java 提交中击败了5.11%的用户
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> re = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<TreeNode>(); //队列
if(root==null){ //空树
return result;
}
re.add(root.val);
result.add(re); //先把根节点加进去
queue.offer(root); //队列中也加入根节点
while(queue.size()>0){ //队列中还有元素
List<Integer> re1 = new ArrayList<>();
int len = queue.size();
for(int i=0;i<len;i++){ //遍历当前层的所有节点,将下一层的所有节点的值保存在re1中
TreeNode n = queue.poll();
if(n.left!=null){ //左节点
re1.add(n.left.val);
queue.offer(n.left); //加入队列
}
if(n.right!=null){ //右节点
re1.add(n.right.val);
queue.offer(n.right); //加入队列
}
}
if(re1.size()>0){
result.add(re1); //将该层的所有节点对应的值加到result中
}
}
return result;
}
}