题目
返回其按 层序遍历 得到的节点值。(即逐层地,从左到右访问所有节点)
方法一:广度优先搜索BFS
初始化:i=1的时候,队列里面只有 root
保持:如果i=k时性质成立,即第 k 轮中出队 s_k的元素是第 k 层的所有元素,并且顺序从左到右。
终止:因为该循环不变式是正确的,所以按照这个方法迭代之后每次迭代得到的也就是当前层的层次遍历结果。
先记录队列中的结点数量 n(也就是这一层的结点数量),然后一口气处理完这一层的 n 个结点。
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ret =new ArrayList<List<Integer>>();
if (root == null) {
return ret;
}
Queue<TreeNode> queue=new LinkedList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()){
List<Integer> level=new ArrayList<Integer>();
int cur=queue.size();
for(int i=0;i<cur;++i){
TreeNode node=queue.poll();
level.add(node.val);
if(node.left!=null){
queue.offer(node.left);
}
if(node.right!=null){
queue.offer(node.right);
}
}
ret.add(level);
}
return ret;
}
复杂度分析
记树上所有节点的个数为 n。
时间复杂度:每个点进队出队各一次,故渐进时间复杂度为O(n)。
空间复杂度:队列中元素的个数不超过 n 个,故渐进空间复杂度为O(n)。
BFS 遍历:「层序遍历」、「最短路径」使用队列数据结构
void bfs(TreeNode root) {
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll(); // Java 的 pop 写作 poll()
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
}
DFS遍历:递归的方式隐含地使用了系统的栈
void dfs(TreeNode root) {
if (root == null) {
return;
}
dfs(root.left);
dfs(root.right);
}