- 题目描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
来源:LeetCode
- 示例
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
- 思路分析
- 层序遍历是先入先出的,因此用队列存储节点。
- 又因为要按层次分成不同的链表,因此在每一层,都通过上一层记录的这一层的孩子个数来判断这一层的节点是否已经读取完毕,并且在读取过程中记录下一层的孩子个数。
- Java Queue:
Queue<> queue = new LinkedList(); //初始化 queue.add(element); //在队列末尾添加一个元素,如果队列已满,抛出unchecked异常 queue.offer(element); //在队列末尾添加一个元素,如果队列已满,返回false queue.poll(); //返回第一个元素并删除,如果为空,返回null queue.remove(); //返回第一个元素并删除,如果为空,抛出异常 queue.peek(); //返回第一个元素,如果为空,返回null queue.element(); //返回第一个元素,如果队列为空,抛出异常
- JAVA实现
/**
* 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;
int last = 1; //统计下一层的孩子总数
int next = 0;
Queue<TreeNode> queue = new LinkedList();
queue.add(root);
while(queue.peek() != null) {
List<Integer> temp = new ArrayList();
while(last > 0) { //循环读取这一层的所有节点
root = queue.poll();
temp.add(root.val);
if(root.left != null) { //如果有左孩子
queue.add(root.left); //左孩子进入队列
next++;
}
if(root.right != null) { //如果有右孩子
queue.add(root.right); //右孩子进入队列
next++;
}
last--; //last表示这一层还有多少个节点没有读
}
ans.add(new ArrayList(temp));
last = next;
next = 0;
}
return ans;
}
}