diff --git a/pkg/construct_binary_tree_from_preorder_and_inorder_traversal/main.go b/pkg/construct_binary_tree_from_preorder_and_inorder_traversal/main.go new file mode 100644 index 0000000..455a460 --- /dev/null +++ b/pkg/construct_binary_tree_from_preorder_and_inorder_traversal/main.go @@ -0,0 +1,65 @@ +package constructbinarytreefrompreorderandinordertraversal + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +type NodeInfo struct { + Val int + Preorder int + Inorder int +} + +func buildTreeInfo(info []NodeInfo) *TreeNode { + if len(info) == 0 { + return nil + } + + root_info := info[0] + for _, datum := range info { + if datum.Preorder < root_info.Preorder { + root_info = datum + } + } + + left_info := []NodeInfo{} + right_info := []NodeInfo{} + for _, datum := range info { + if datum.Inorder < root_info.Inorder { + left_info = append(left_info, datum) + } else if datum.Inorder > root_info.Inorder { + right_info = append(right_info, datum) + } else { + continue + } + } + + return &TreeNode{ + Val: root_info.Val, + Left: buildTreeInfo(left_info), + Right: buildTreeInfo(right_info), + } +} + +func buildTree(preorder []int, inorder []int) *TreeNode { + info_map := map[int]*NodeInfo{} + for o, v := range preorder { + info_map[v] = &NodeInfo{ + Val: v, + Preorder: o, + } + } + + for o, v := range inorder { + info_map[v].Inorder = o + } + + info := []NodeInfo{} + for _, datum := range info_map { + info = append(info, *datum) + } + + return buildTreeInfo(info) +}