package main

import "fmt"

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

var index int

func KthNode(proot *TreeNode, k int) int {
	// write code here
	res := midTravel(proot, k)
	if res == nil {
		return -1
	}
	return res.Val
}

func midTravel(node *TreeNode, targetPos int) *TreeNode {
	if node == nil {
		return nil
	}
	if res := midTravel(node.Left, targetPos); res != nil {
		return res
	}
	index += 1
	if targetPos == index {
		return node
	}
	if res := midTravel(node.Right, targetPos); res != nil {
		return res
	}
	return nil
}

func main() {
	node1 := &TreeNode{Val: 5}
	node2 := &TreeNode{Val: 3}
	node3 := &TreeNode{Val: 7}
	node4 := &TreeNode{Val: 2}
	node5 := &TreeNode{Val: 4}
	node6 := &TreeNode{Val: 6}
	node7 := &TreeNode{Val: 8}

	node1.Left = node2
	node1.Right = node3
	node2.Left = node4
	node2.Right = node5
	node3.Left = node6
	node3.Right = node7

	k := 3
	res := KthNode(node1, k)
	fmt.Println(res)
}