解题思路
本题要求从上至下打印出二叉树的每一个节点,同一层的节点按照从左至右的顺序进行打印。
如示例:
该二叉树遍历打印的结果为:[ 3,9,2,5,7 ]
这是一道典型的 BFS 遍历二叉树,BFS 通常使用队列(Queue)先入先出这种特性来实现。
算法流程:
当树的根节点为空,则直接返回空数组
初始化队列,将 root 根节点添加到队列中
BFS 循环
- 队首元素出队,记作 node;
- 将 node.val 添加到队列列表中;
- 如果 node 的左(右)节点不为空,则将左(右)节点添加到队列。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int[] levelOrder(TreeNode root) {
if(root == null){
return new int[]{};
}
Queue<TreeNode> queue = new LinkedList<>();
List<Integer> list = new ArrayList<>();
queue.offer(root);
while(!queue.isEmpty()){
root = queue.poll();
list.add(root.val);
if(root.left != null){
queue.offer(root.left);
}
if(root.right != null){
queue.offer(root.right);
}
}
return list.stream().mapToInt(Integer::valueOf).toArray();
}
}
复杂度分析
- 时间复杂度:O(N)
我们需要将整棵树进行一次遍历,所以时间复杂度为:O(N)
- 空间复杂度:O(N)
当待遍历的树为一棵平衡二叉树时,最多有 N/2 个节点同时在队列中,所以使用 O(N) 的额外空间