本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
剑指 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 本题额外要求:打印顺序交替变化