// LeetCode binary tree definition
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// create a bianry tree given an array of `int` or `nil`
// e.g. root := makeBinaryTree([]any{1, 2, 3, nil, nil, 4, 5})
// will produce a binary tree:
// 1
// 2 3
// nil nil 4 5
func makeBinaryTree(nodes []any) *TreeNode {
var root *TreeNode
queue := []*TreeNode{}
for i, n := range nodes {
var cur *TreeNode
if n != nil {
cur = &TreeNode{
Val: n.(int),
Left: nil,
Right: nil,
}
}
queue = append(queue, cur)
for queue[0] == nil {
queue = queue[1:]
}
if i == 0 {
root = cur
} else if i%2 != 0 {
queue[0].Left = cur
} else {
queue[0].Right = cur
queue = queue[1:]
}
}
return root
}
// print a bianry tree
func printBinaryTree(root *TreeNode) {
flat := []*TreeNode{}
queue := []*TreeNode{root}
for len(queue) > 0 {
cur := queue[0]
queue = queue[1:]
flat = append(flat, cur)
if cur != nil {
queue = append(queue, cur.Left)
queue = append(queue, cur.Right)
}
}
for i := len(flat) - 1; i >= 0 && flat[i] == nil; i-- {
flat = flat[:len(flat)-1]
}
fmt.Print("[")
for i, v := range flat {
if v != nil {
fmt.Print(v.Val)
} else {
fmt.Print("null")
}
if i < len(flat)-1 {
fmt.Print(", ")
}
}
fmt.Println("]")
}