描述
题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
示例
输入:{8,6,10,5,7,9,11}
返回值:[[8],[6,10],[5,7,9,11]]知识点:二叉树,BFS
难度:⭐⭐⭐
题解
解题思路
既然是最终结果是按层打印,分别收集每一层的结点的值,最容易想到的肯定是按层进行层序遍历,而层序遍历或BFS广度优先遍历,一般通过队列实现,栈也可以。
方法一:层序遍历
图解


算法流程:
- 维护一个队列,每次只保存当前层的结点
- 通过两个左右指针,对每一层的遍历从左指针遍历到右指针,同时收集结果
- 对每个结点,如果有子节点,则按顺序加入左右子节点到队列,为下一层遍历做准备
Java 版本代码如下:
import java.util.*;
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > res = new ArrayList<>();
if(pRoot == null) {
return res;
}
// 队列每次只保存当前层的结点
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(pRoot);
while(!queue.isEmpty()) {
ArrayList<Integer> list = new ArrayList<>();
// lo为每一层的左边结点指针,hi为右边结点指针
int lo = 0, hi = queue.size();
// 从左到右按顺序遍历当前层的每一个节点
while(lo++ < hi) {
TreeNode node = queue.poll();
// 收集当前层每一个结点的值
if(node != null) {
list.add(node.val);
}
// 按顺序加入左右子节点,为下一层遍历做准备
if(node.left != null) {
queue.add(node.left);
}
if(node.right != null) {
queue.add(node.right);
}
}
// 收集当前层的结果集
res.add(list);
}
return res;
}
} Python 版本代码如下:
class Solution:
# 返回二维列表[[1,2],[4,5]]
def Print(self, pRoot):
# write code here
if not pRoot:
return []
# 层次遍历
result = []
# 借助队列实现
que = []
que.append(pRoot)
temp = pRoot
# 遍历每一层
while len(que)>0:
sz = len(que)
ans = []
# 遍历当前层每个结点
for i in range(sz):
node = que[0]
ans.append(node.val)
que.pop(0)
if node.left :
que.append(node.left)
if node.right :
que.append(node.right)
result.append(ans)
return result 复杂度分析:
时间复杂度 O(MN):M为树的层数,N为每一层的结点数
空间复杂度 O(N):借助队列实现

京公网安备 11010502036488号