LeetCode-in-Go

103. Binary Tree Zigzag Level Order Traversal

Medium

Given the root of a binary tree, return the zigzag level order traversal of its nodes’ values. (i.e., from left to right, then right to left for the next level and alternate between).

Example 1:

Input: root = [3,9,20,null,null,15,7]

Output: [[3],[20,9],[15,7]]

Example 2:

Input: root = [1]

Output: [[1]]

Example 3:

Input: root = []

Output: []

Constraints:

Solution

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func zigzagLevelOrder(root *TreeNode) [][]int {
	var result [][]int
	if root == nil {
		return result
	}
	queue := []*TreeNode{root, nil}
	zig := true
	var level []int
	for len(queue) > 0 {
		node := queue[0]
		queue = queue[1:]
		for node != nil {
			if zig {
				level = append(level, node.Val)
			} else {
				level = append([]int{node.Val}, level...)
			}
			if node.Left != nil {
				queue = append(queue, node.Left)
			}
			if node.Right != nil {
				queue = append(queue, node.Right)
			}
			if len(queue) > 0 {
				node = queue[0]
				queue = queue[1:]
			} else {
				node = nil
			}
		}
		result = append(result, level)
		zig = !zig
		level = []int{}
		if len(queue) > 0 {
			queue = append(queue, nil)
		}
	}
	return result
}