102.二叉树的层次遍历
原题链接
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
要点
这个题目的是要打印每一层的所有数据,很直观的可以想到BFS(广度搜索优先)策略,也就是所谓的层次遍历。
二叉树的层次遍历动画演示
BFS(广度搜索) - 1
将每一层的节点放进一个队列,然后依次推出节点。此时所有节点出队列的顺序由高到底,且因为每次推出元素是由一个for循环控制某一层的所有元素,即将这一层所有的元素放入数组。
代码片段
func levelOrder(root *TreeNode) [][]int {
if root == nil {
return nil
}
var nums [][]int
link := list.New()
link.PushBack(root)
for link.Len() > 0 {
length := link.Len()
var num []int
for i := 0; i < length; i++ {
node := link.Remove(link.Back()).(*TreeNode)
num = append(num, node.Val)
if node.Left != nil {
link.PushFront(node.Left)
}
if node.Right != nil {
link.PushFront(node.Right)
}
}
nums = append(nums, num)
}
return nums
}
代码解释
要熟练掌握这种层次遍历的方式,最外层的循环是程序继续执行的条件,而内层的循环的让我们知道现在是到了第几层。
递归 - 1
其实就是一个普通的先序遍历+当前层级
代码片段
func levelOrder(root *TreeNode) [][]int {
if root == nil {
return nil
}
var nums [][]int
levelOrderHelper(root, &nums, 0)
return nums
}
func levelOrderHelper