Skip to content

Instantly share code, notes, and snippets.

@yojkim
Created September 27, 2018 13:40
Show Gist options
  • Save yojkim/c5d46db1eddaf3a2443fb9b1a04d1807 to your computer and use it in GitHub Desktop.
Save yojkim/c5d46db1eddaf3a2443fb9b1a04d1807 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"io/ioutil"
"log"
"sort"
"strconv"
"strings"
)
type Node struct {
idx int
x int
y int
left *Node
right *Node
}
var preOrderResult []int
var postOrderResult []int
func searchTree(node *Node) {
preOrderResult = append(preOrderResult, node.idx)
if node.left != nil {
searchTree(node.left)
}
if node.right != nil {
searchTree(node.right)
}
postOrderResult = append(postOrderResult, node.idx)
}
func solution(nodeInfo [][]int) [][]int {
nodeLevels := make(map[int][]*Node)
preOrderResult = make([]int, 0)
postOrderResult = make([]int, 0)
for i, info := range nodeInfo {
nodeLevels[info[1]] = append(nodeLevels[info[1]], &Node{
idx: i + 1,
x: info[0],
y: info[1],
left: nil,
right: nil,
})
}
levels := make([]int, 0)
for level := range nodeLevels {
levels = append(levels, level)
}
sort.Sort(sort.Reverse(sort.IntSlice(levels)))
rootNode := nodeLevels[levels[0]][0]
var currentNode *Node
for _, level := range levels[1:] {
for _, node := range nodeLevels[level] {
currentNode = rootNode
for {
if currentNode.x < node.x {
if currentNode.right == nil {
currentNode.right = node
break
} else {
currentNode = currentNode.right
}
} else {
if currentNode.left == nil {
currentNode.left = node
break
} else {
currentNode = currentNode.left
}
}
}
}
}
searchTree(rootNode)
results := [][]int{
preOrderResult,
postOrderResult,
}
return results
}
func main() {
data, err := ioutil.ReadFile("input.txt")
if err != nil {
log.Fatalln(err.Error())
}
inputStr := string(data)
inputStr = strings.Replace(inputStr, "[[", "", -1)
inputStr = strings.Replace(inputStr, "]]", "", -1)
inputStr = strings.Replace(inputStr, "],[", " ", -1)
splittedStr := strings.Split(inputStr, " ")
nodeInfo := make([][]int, 0)
for _, str := range splittedStr {
x, _ := strconv.Atoi(strings.Split(str, ",")[0])
y, _ := strconv.Atoi(strings.Split(str, ",")[1])
temp := []int{x, y}
nodeInfo = append(nodeInfo, temp)
}
fmt.Println(solution(nodeInfo))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment