package main

import (
	"strconv"
)

// ListNode ...
type ListNode struct {
	Val  int
	Next *ListNode
}

// TreeNode ...
type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func abs(x int) int {
	if x < 0 {
		return -x
	}
	return x
}

func maxInt(x, y int) int {
	if x > y {
		return x
	}
	return y
}

func minInt(x, y int) int {
	if x < y {
		return x
	}
	return y
}

func toLinkedList(num []int) *ListNode {
	length := len(num)
	if length == 0 {
		return nil
	}
	head := ListNode{num[0], nil}
	curr := &head
	for i := 1; i < length; i++ {
		curr.Next = &ListNode{num[i], nil}
		curr = curr.Next
	}
	return &head
}

func printList(head *ListNode) {
	curr := head
	for curr != nil {
		print(strconv.FormatInt(int64(curr.Val), 10), " ")
		curr = curr.Next
	}
	println()
}

func printTree(root *TreeNode) { // Level order traversal
	if root == nil {
		println("nil")
		return
	}
	queue := make([]*TreeNode, 0) // Important!
	queue = append(queue, root)
	for len(queue) != 0 {
		curr := queue[0]
		queue = queue[1:] // Dequeue
		if curr == nil {
			print("nil ")
			continue
		}
		print(curr.Val, " ")
		if curr.Left != nil {
			queue = append(queue, curr.Left)
		} else if curr.Right != nil {
			queue = append(queue, nil)
		}
		if curr.Right != nil {
			queue = append(queue, curr.Right)
		} else if curr.Left != nil {
			queue = append(queue, nil)
		}
	}
	println()
}