「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」。
描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
例如: 给定的二叉树是{1,2,3,#,#,4,5}
该二叉树之字形层序遍历的结果是 [ [1], [3,2], [4,5] ]
示例1
输入:
{1,2,3,#,#,4,5}
返回值:
[[1],[3,2],[4,5]]
说明:
如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。
示例2
输入:
{8,6,10,5,7,9,11}
返回值:
[[8],[10,6],[5,7,9,11]]
示例3
输入:
{1,2,3,4,5}
返回值:
[[1],[3,2],[4,5]]
这一题其实我们思路很简单,直接把进行层次遍历,然后把偶数层的进行反转即可。那么问题就是如何控制层数了。
func Print( pRoot *TreeNode ) [][]int {
if pRoot == nil {
return nil
}
var ans [][]int
(1) queue := []*TreeNode{pRoot}
(2) for len(queue)>0{
(3) n := len(queue)
(4) var a []int
(5) for i:=0;i<n;i++{
(6) curNode := queue[0]
(7) queue = queue[1:]
(8) a = append(a, curNode.Val)
(9) if curNode.Right != nil{
(10) queue = append(queue,curNode.Right)
}
(11) if curNode.Left != nil{
(12) queue = append(queue,curNode.Left)
}
}
(13) k1 := len(a)
(14) k2 := len(ans)
(15) if k2%2 != 1{
(16) for j := 0 ; j < k1/2; j++ {
(17) a[j], a[k1-j-1] = a[k1-j-1], a[j]
}
}
(18) ans = append(ans,a)
}
return ans
}
- (1) 定义一个队列去存储,进行节点的压入压出
- (2) 如果这个队列的数大于0的话,就表示还在继续遍历这颗二叉树
- (3) 定义n等于队列的大小,此时的队列大小就是,该层有多少个节点
- (4) 定义存储该层数的数组
- (5) 对该层的数据进行遍历
- (6) 把队列头元素弹出
- (7) 把队列向后移动
- (8) 把这个弹出的值放到数组a中,表示第一层的元素,也就只有一个。
- (9) 于是开始对该节点的右孩子进行判断
- (10) 如果不是空就放入队列中
- (11) 开始对该节点的左孩子进行判断
- (12) 如果不是空就放入队列中
- (13) 获取该层数组的个数
- (14) 获取这是哪一层
- (15) 如果这层是偶数层
- (16) 进行交换
- (17) 进行交换
- (18) 合并到ans中