func (t *TreeNode) Desc() {
	if t == nil {
		return
	}
	fmt.Println(t.Val)
	t.Left.Desc()
	t.Right.Desc()
}
Desc - description of tree
package ds
import "fmt"
type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}
type BuildItem struct {
	Parent   *TreeNode
	ChildVal interface{}
	IsLeft   bool
}
func BuildTree(nums []interface{}) *TreeNode {
	if nums == nil || len(nums) == 0 {
		return nil
	}
	dummy := &TreeNode{Val: 0}
	item := BuildItem{Parent: dummy, ChildVal: nums[0], IsLeft: true}
	q := []BuildItem{item}
	p := 1
	for len(q) != 0 {
		it := q[0]
		q = q[1:]
		var child *TreeNode
		if it.ChildVal != nil {
			child = &TreeNode{Val: it.ChildVal.(int)}
		}
		if it.IsLeft {
			it.Parent.Left = child
		} else {
			it.Parent.Right = child
		}
		if child != nil && p < len(nums) {
			q = append(q, BuildItem{Parent: child, ChildVal: nums[p], IsLeft: true})
			p++
			q = append(q, BuildItem{Parent: child, ChildVal: nums[p], IsLeft: false})
			p++
		}
	}
	return dummy.Left
}
func NewTree(v int) *TreeNode {
	return &TreeNode{v, nil, nil}
}
func (t *TreeNode) Insert(v int, left bool) *TreeNode {
	if t == nil {
		return &TreeNode{v, nil, nil}
	}
	if left {
		t.Left = t.Left.Insert(v, true)
		return t.Left
	}
	t.Right = t.Right.Insert(v, false)
	return t.Right
}