102 二叉树的层序遍历-中等
题目:
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
分析:
算法1:bfs广度优先搜索
借助队列数据结构,先入先出,实现层序遍历。
// date 2020/03/21
// 层序遍历
// bfs广度优先搜索
// 算法一:使用队列,逐层遍历
func levelOrder(root *TreeNode) [][]int {
if root == nil {
return [][]int{}
}
res := make([][]int, 0, 16)
queue := make([]*TreeNode, 0, 16)
queue = append(queue, root)
for len(queue) != 0 {
n := len(queue)
curRes := make([]int, 0, 16)
for i := 0; i < n; i++ {
cur := queue[i]
curRes = append(curRes, cur.Val)
if cur.Left != nil {
queue = append(queue, cur.Left)
}
if cur.Right != nil {
queue = append(queue, cur.Right)
}
}
res = append(res, curRes)
queue = queue[n:]
}
return res
}
算法2:dfs深度优先搜索
这里的思路类似求二叉树的最大深度,借助dfs搜索,在每一层追加结果。
// date 2020/03/21
func levelOrder(root *TreeNode) [][]int {
res := make([][]int, 0, 16)
var dfs func(root *TreeNode, level int)
dfs = func(root *TreeNode, level int) {
if root == nil {
return
}
if len(res) == level {
res = append(res, make([]int, 0, 4))
}
res[level] = append(res[level], root.Val)
level++
dfs(root.Left, level)
dfs(root.Right, level)
}
dfs(root, 0)
return res
}
注意,从上面两种实现的方式来看,层序遍历既可以使用广度优先搜索,也可以使用深度优先搜索。
最后更新于