题目
给你二叉树的根节点 root ,返回其节点值的层序遍历。 (即逐层地,从左到右访问所有节点)。
思路
一见到二叉树的从上至下遍历,应该想到广度优先搜索(BFS)。BFS 通常借助队列的先入先出特性来实现
复杂度分析
时间复杂度 O(N) : N 为二叉树的节点数量,即 BFS 需循环 N 次。
空间复杂度 O(N) : 最差情况下,即当树为平衡二叉树时,最多有 N/2个树节点同时在队列中,使用 O(N) 大小的额外空间。
Python版
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if root is None:
return []
ans = []
# 当前待遍历的层,根默认是首层
cur = [root]
while cur:
# 下次待遍历的层
nxt = []
vals = []
for node in cur:
vals.append(node.val)
if node.left: nxt.append(node.left)
if node.right: nxt.append(node.right)
cur = nxt
ans.append(vals)
return ans
用例:
输出:
[[3],[9,20],[15,7]]
Golang版
方法一
package main
/**
* Definition for a binary tree node.
*/
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// 总结: 前序遍历,遍历时记录层级,记录层级的值
func levelOrder(root *TreeNode) (res [][]int) {
var preorder func(node *TreeNode, depath int)
preorder = func(node *TreeNode, depth int) {
if node == nil {
return
}
if depth == len(res) {
res = append(res, []int{})
}
res[depth] = append(res[depth], node.Val)
preorder(node.Left, depth+1)
preorder(node.Right, depth+1)
return
}
preorder(root, 0)
return
}
方法二
package main
/**
* Definition for a binary tree node.
*/
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func levelOrder(root *TreeNode) [][]int {
ret := [][]int{}
if root == nil {
return ret
}
q := []*TreeNode{root}
for i := 0; len(q) > 0; i++ {
ret = append(ret, []int{})
p := []*TreeNode{}
for j := 0; j < len(q); j++ {
node := q[j]
ret[i] = append(ret[i], node.Val)
if node.Left != nil {
p = append(p, node.Left)
}
if node.Right != nil {
p = append(p, node.Right)
}
}
q = p
}
return ret
}