Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如:给定二叉树:
[3,9,20,null,null,15,7],3 / \ 9 20 / \ 15 7
返回
[3,9,20,15,7]
二、思路分析
- 从上到下打印二叉树,也就是层序遍历二叉树,使用广度优先遍历方式可以完成层序遍历。
- 首先创建一个队列
q,将根节点存放进去。 for循环确保q不为空,q为空时说明所有节以及遍历完了。循环中复制队列q为tmp,将q置空。此时tmp代表了一层节点,将tmp中的字节逐个遍历,再将这些节点的子节点一一加入q队列中,此时q保存了新一层的节点,q为空时,意味着已经没有子节点能够加入q中了,遍历结束。
三、AC 代码
func levelOrder(root *TreeNode) (ans []int) {
if root == nil {
return
}
q := make([]*TreeNode,0)
q = append(q,root)
ans = make([]int,0)
for q != nil {
tmp := q
q = nil
for i := 0;i<len(tmp);i++ {
node := tmp[i]
ans = append(ans,node.Val)
if node.Left != nil {
q = append(q,node.Left)
}
if node.Right != nil {
q = append(q,node.Right)
}
}
}
return
}
四、总结
很经典的一道题目,层序遍历,使用广度优先遍历,需要注意的细节是在加入队列第一个元素前,首先要判断root节点是否为空,如果为空则直接返回,避免空指针异常。