剑指 Offer 32 - II. 从上到下打印二叉树 II

1416人浏览 / 0人评论

题目

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

例如:

给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其层次遍历结果:
[
  [3],
  [9,20],
  [15,7]
]

题解

本题是剑指 Offer 32 - I. 从上到下打印二叉树的变种,区别是需要把每一层打印到一行,同样使用辅助队列来实现BFS

  • 初始化结果数组res为空,初始化辅助队列queue为root节点
s1.png
  • 循环执行:新建本层结果tmp
s2.png
  • 记录当前queue节点数量n,执行n次出队操作
  • 出队时,将当前节点val写入tmp,叶子节点入队
  • 本层打印完毕时,tmp写入res
s3.png
  • queue为空时,循环结束
s4.png

代码

func levelOrder(root *TreeNode) [][]int {
	// 特殊场景:根节点为nil时,返回空数组
	if root == nil {
		return [][]int{}
	}
	// 初始化辅助队列
	var queue []*TreeNode = []*TreeNode{root}
	// 初始化结果数组
	res := make([][]int, 0)
	// queue为空时,退出循环
	for len(queue) > 0 {
		// 新建本层结果数组
		tmp := make([]int, 0)
		// 记录当前本层节点数量
		size := len(queue)
		// 记录本层结果
		for i := 0; i < size; i++ {
			// 出队
			node := queue[0]
			queue = queue[1:]
			// 写入出队节点val
			tmp = append(tmp, node.Val)
			// 写入出队节点子节点
			if node.Left != nil {
				queue = append(queue, node.Left)
			}

			if node.Right != nil {
				queue = append(queue, node.Right)
			}
		}
		res = append(res, tmp)
	}
	return res
}

全部评论