同学们,我把《剑指Offer》中所有“树”标签的习题及思路整理出来了,对照学习效果更佳:
题目分析:层序遍历、广度优先(BFS)一般都是借助队列的!!!
这道题建议参考二叉树的深度,其中的第二种解法——层序遍历,用队列的思想巧妙地实现。
算法步骤:
- 借助队列FIFO的思想,首先创建队列,将根节点加入
- 创建收集结果的
list
集合,由于不知道节点的个数,所以先用集合 - 进入循环,循环的目的是将队列清空,因此终止条件是队列为空
- 第一次循环时,先从队列中
poll()
出来一个,把其val
加入集合 - 然后判断这个点是否存在左右子节点,如果存在就加入队列
- 最后把集合转换成数组输出
这样做的好处就是能够做到按层遍历,且是从左到右的,同一层的顺序永远高于下一层的顺序
代码如下:
class Solution {
public int[] levelOrder(TreeNode root) {
if(root==null) return new int[0];
//辅助队列
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
//结果数组
List<Integer> res=new ArrayList<>();
while(!queue.isEmpty()) {
TreeNode node=queue.poll();
res.add(node.val);
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}
//转数组
int[] T=new int[res.size()];
for(int i=0;i<res.size();i++) {
T[i]=res.get(i);
}
return T;
}
}
复杂度分析:
- 时间复杂度为O(N),因为要遍历整棵树
- 空间复杂度为O(N),因为需要队列的额外空间