1+ // 풀이
2+ // preorder[0]이 제일 꼭대기
3+ // preorder 배열의 root index, inorder 배열의 시작, inorder 배열의 끝
4+ // 위의 세가지를 parameter로 받는 재귀함수를 만들어서
5+ // 왼쪽 서브트리, 오른쪽 서브트리를 순회
6+
7+ // TC
8+ // map 만들기 O(n) + 재귀함수는 각 노드를 딱 한번씩만 방문하므로 O(n) = O(n)
9+
10+ // SC
11+ // map O(n) + 재귀함수 최악의 경우 한쪽으로만 노드가 이어지는 경우 O(n) = O(n)
12+
13+ /**
14+ * Definition for a binary tree node.
15+ * type TreeNode struct {
16+ * Val int
17+ * Left *TreeNode
18+ * Right *TreeNode
19+ * }
20+ */
21+
22+ func buildTree (preorder []int , inorder []int ) * TreeNode {
23+ inorderMap := make (map [int ]int )
24+ for i , n := range inorder {
25+ inorderMap [n ] = i
26+ }
27+
28+ var recursive func (rootIndex , inStart , inEnd int ) * TreeNode
29+ recursive = func (rootIndex , inStart , inEnd int ) * TreeNode {
30+ if rootIndex >= len (preorder ) || inStart > inEnd {
31+ return nil
32+ }
33+ rootVal := preorder [rootIndex ]
34+ rootInorderIndex := inorderMap [rootVal ]
35+
36+ result := & TreeNode {
37+ Val : rootVal ,
38+ }
39+
40+ leftSize := rootInorderIndex - inStart
41+
42+ result .Left = recursive (rootIndex + 1 , inStart , rootInorderIndex - 1 )
43+ result .Right = recursive (rootIndex + 1 + leftSize , rootInorderIndex + 1 , inEnd )
44+
45+ return result
46+ }
47+
48+ return recursive (0 , 0 , len (inorder )- 1 )
49+ }
50+
0 commit comments