给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
测试用例
示例:
二叉树:[1,2,3,4,null,6,7]
返回其层次遍历结果:
[
[1],
[2,3],
[4,6,7]
]
解题思路
广度优先搜索
- 首先根元素入队
- 当队列不为空的时候
- 求当前队列 s i s_i si的长度
- 依次从队列中取 s i s_i si个元素进行拓展,然后进入下一次迭代
它和 BFS 的区别在于 BFS 每次只取一个元素拓展,而这里每次取 s i s_i si个元素。在上述过程中的第 i i i 次迭代就得到了二叉树的第 i i i层的 s i s_i si个元素。
Code
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (root == null) {
return result;
}
//定义一个节点队列
List<TreeNode> queue = new LinkedList<TreeNode>();
//入队
queue.add(root);
while (!queue.isEmpty()) {
//定义 层数组,存储 每一层元素
List<Integer> level = new ArrayList<Integer>();
int currentLevelSize = queue.size();
for (int i = 0; i < currentLevelSize; i++) {
//出队
TreeNode node = queue.remove(0);
level.add(node.val);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
result.add(level);
}
return result;
}
}
复杂度分析
记树上所有节点的个数为 n n n。
- 时间复杂度:每个节点进队出队各一次,故渐进时间复杂度为 O ( n ) O(n) O(n)。
- 空间复杂度:队列中元素的个数不超过 n n n 个,故渐进空间复杂度为 O ( n ) O(n) O(n)。