原题链接

题目描述:

给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:给定二叉树[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
}