Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如: 给定二叉树: [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
复制代码
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
复制代码
提示:
节点总数 <= 1000
二、思路分析
- 从上到下打印二叉树,使用广度优先遍历方法,创造一个队列q,不断将当前节点的子树加入队列中。
- 本题与从上到下打印二叉树不同的是,需要将奇数层的数值翻转后加入答案数组中。
- 加入一个num记录当前在奇数层还是偶数层,如果为奇数层则将当前数组内容翻转后加入答案的二维数组中。
- 队列遍历的条件是,q队列不为空,复制q队列内容为tmp队列,使q队列为空,遍历tmp队列,将节点的左右子节点再次加入q队列中,如果当前层为奇数层,翻转数组内容,加入答案数组中。
三、AC 代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func levelOrder(root *TreeNode) (ans [][]int) {
if root == nil {
return [][]int{}
}
q := make([]*TreeNode,0)
q = append(q,root)
num := 0
for q != nil {
tmp := q
q = nil
tmpres := make([]int,0)
for i := 0 ;i<len(tmp);i++ {
node := tmp[i]
tmpres = append(tmpres,node.Val)
if node.Left != nil {
q = append(q,node.Left)
}
if node.Right != nil {
q = append(q,node.Right)
}
}
if num % 2 == 1 {
ans = append(ans,reverse(tmpres))
}else{
ans = append(ans,tmpres)
}
num++
}
return
}
func reverse(nums []int) []int{
l,r := 0,len(nums)-1
for ;l < r;l,r = l+1,r-1 {
nums[l],nums[r] = nums[r],nums[l]
}
return nums
}
复制代码
四、总结
本题在从上到下遍历二叉树的基础上加入奇偶计数,将奇数层的数据翻转,附加一个翻转数组函数。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END