package q103 import "slices" type TreeNode struct { Val int Left *TreeNode Right *TreeNode } func zigzagLevelOrder(root *TreeNode) [][]int { ret := [][]int{} if root == nil { return ret } dpth := 1 buf := make([]int, 512) row := buf[:0] type qElem struct { depth int node *TreeNode } queue := make([]qElem, 0, 256) queue = append(queue, qElem{depth: 1, node: root}) for ; len(queue) > 0; queue = queue[1:] { c := queue[0] if c.depth > dpth { if dpth%2 == 0 { slices.Reverse(row) } ret = append(ret, make([]int, len(row))) copy(ret[len(ret)-1], row) dpth = c.depth row = buf[:0] } row = append(row, c.node.Val) if c.node.Left != nil { queue = append(queue, qElem{depth: c.depth + 1, node: c.node.Left}) } if c.node.Right != nil { queue = append(queue, qElem{depth: c.depth + 1, node: c.node.Right}) } } if dpth%2 == 0 { slices.Reverse(row) } ret = append(ret, row) return ret } var _ = zigzagLevelOrder