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

88 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

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

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

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

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

[
[3],
[9,20],
[15,7]
]

提示:

节点总数 <= 1000
注意:本题与主站 102 题相同:leetcode-cn.com/problems/bi…

思路:

  • 在原有BFS(剑指 Offer 32 - I. 从上到下打印二叉树(BFS))的基础上,嵌套一层内循环,缓存size = len(queue)长度,作为内循环的循环次数,也就是当前一层所包含的元素个数
  • 当内循环了size次数后,也就是将queue当前一层所包含的元素的都遍历完后,跳出内循环,开始下一层的遍历...
  • 注意:for循环必须使用外层循环保存的size,不能直接使用len(queue),因为内循环中的queue是会append操作的,会导致len(queue)的长度不断变化

时间复杂度: O(N),N 为二叉树的节点数量,即 BFS 需循环 N 次。

空间复杂度: O(N),使用O(N) 大小的额外空间。

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func levelOrder(root *TreeNode) [][]int {
    res := make([][]int, 0)
	if root == nil {
		return res
	}

	queue := make([]*TreeNode, 0)
	queue = append(queue, root) // 开始循环前,先塞入root

	for len(queue) > 0 {
		// if len(subRes) > 0 {
		// 	res = append(res, subRes)
		// 	fmt.Println("-0-", subRes)
		// 	fmt.Println("-1-", res)
		// 	subRes = subRes[0:0]
		// }

		subRes := make([]int, 0)
        size := len(queue) // for循环必须使用外层循环保存的size,不能直接使用len(queue),因为内循环中的queue是会append操作的,会导致len(queue)的长度不断变化
		for i := 0; i < size; i++ {
			root = queue[0]   // 获取即将出队的头节点
			subRes = append(subRes, root.Val)
			queue = queue[1:] // 头结点出队

			if root.Left != nil {
				queue = append(queue, root.Left)
			}

			if root.Right != nil {
				queue = append(queue, root.Right)
			}
		}
		res = append(res, subRes)
	}

	return res
}

建议按顺序做此三道题:

剑指 Offer 32 - I. 从上到下打印二叉树              本题额外要求:BFS

剑指 Offer 32 - II. 从上到下打印二叉树 II          本题额外要求:每一层打印到一行

剑指 Offer 32 - III. 从上到下打印二叉树 III        本题额外要求:打印顺序交替变化