[剑指offer_32] 从上到下打印二叉树
1.从上到下打印二叉树
题目描述:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
思路:使用队列进行广度优先搜索遍历,将遍历结果保存在list中,最后list转数组即可解题思路:
题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。
BFS 通常借助 队列 的先入先出特性来实现。
算法流程:
- 特例处理: 当树的根节点为空,则直接返回空列表 [] ;
- 初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;
- BFS 循环: 当队列 queue 为空时跳出;
- 出队: 队首元素出队,记为 node;
- 打印: 将
node.val
添加至列表 list尾部; - 添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
- 返回值: 返回打印结果列表 res 即可。
2.使用队列进行BFS
/**
* 解法一:迭代
*
* 时间复杂度: O(n) ,空间复杂度: O(n)
* @param root 根节点
* @return 层序遍历后数组
*/
public int[] levelOrder(TreeNode root) {
if(root == null){
return new int[0];//判断当树的根节点为空,则直接返回空列表 []
}
List<Integer> list = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();//创建队列
queue.offer(root);//入队
while (!queue.isEmpty()) {
TreeNode node = queue.poll();//出队: 队首元素出队,记为 node;
list.add(node.val);//添加到list集合
if (node.left != null) {
queue.offer(node.left);//取出元素的左节点不为空,入队
}
if (node.right != null) {
queue.offer(node.right);//取出元素的右节点不为空,入队
}
}
//重新创建一个等长的数组,进行遍历赋值
int[] res = new int[list.size()];
for (int i = 0; i < res.length; i++) {
res[i] = list.get(i);
}
return res;
}
3.测试用例
@Test
public void test32(){
TreeNode root = new TreeNode(8);
TreeNode node2 = new TreeNode(6);
TreeNode node3 = new TreeNode(10);
TreeNode node4 = new TreeNode(5);
TreeNode node5 = new TreeNode(7);
TreeNode node6 = new TreeNode(9);
TreeNode node7 = new TreeNode(11);
root.left = node2;
root.right = node3;
node2.left = node4;
node2.right = node5;
node3.left = node6;
node3.right = node7;
/**
* 二叉树
* 8
* / \
* 6 10
* / \ / \
* 5 7 9 11
*
*/
LevelOrder32 levelOrder32 = new LevelOrder32();
System.out.println("层序遍历输出的二叉树:" + Arrays.toString(levelOrder32.levelOrder(root)));
System.out.println("层序遍历输出的二叉树:" + Arrays.toString(levelOrder32.levelOrder(null)));//输出为[]
}