原题链接
题目描述:
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:给定二叉树[3,9,20,null,null,15,7]
,
1
2
3
4
5
|
3
/ \
9 20
/ \
15 7
|
返回锯齿形层序遍历如下:
1
2
3
4
5
|
[
[3],
[20,9],
[15,7]
]
|
解题思路:
1. 层序遍历树,拿到每层的节点值
2. 从题意得知,就是一会从左往右,一会从右往左
3. 定义一个flag变量,用来控制数组进的方向。这里flag为true时,就正常出
golang
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func zigzagLevelOrder(root *TreeNode) [][]int {
var results [][]int
if root == nil {
return results
}
queue := []*TreeNode{root}
// 是否反转,false为以队列方式出,true为以栈方式出
flag := false
for len(queue) > 0 {
currCnt := len(queue)
// 保存了当前层的结果
result := []int{}
// 这一步是将当前层节点出出队
for i := 0; i < currCnt; i++ {
curNode := queue[0]
queue = queue[1:]
if curNode.Left != nil {
queue = append(queue, curNode.Left)
}
if curNode.Right != nil {
queue = append(queue, curNode.Right)
}
result = append(result, curNode.Val)
}
// 需要反转
if flag {
// 反转代码开始
reverseResult := []int{}
for len(result) > 0 {
v := result[len(result) - 1]
reverseResult = append(reverseResult, v)
result = result[:len(result) - 1]
}
// 反转结束,反转后加入结果集
results = append(results, reverseResult)
} else {
// 层序遍历本来的就是从左到右,直接加入结果集
results = append(results, result)
}
// 下一次,取当前相反值
flag = !flag
}
return results
}
|