1+ // Definition for a binary tree node.
2+ class TreeNode {
3+ val : number ;
4+ left : TreeNode | null ;
5+ right : TreeNode | null ;
6+ constructor ( val ?: number , left ?: TreeNode | null , right ?: TreeNode | null ) {
7+ this . val = val === undefined ? 0 : val ;
8+ this . left = left === undefined ? null : left ;
9+ this . right = right === undefined ? null : right ;
10+ }
11+ }
12+
13+ // T.C: O(N)
14+ // S.C: O(N)
15+ function buildTree ( preorder : number [ ] , inorder : number [ ] ) : TreeNode | null {
16+ if ( preorder . length === 0 || inorder . length === 0 ) {
17+ return null ;
18+ }
19+ const root = new TreeNode ( preorder [ 0 ] ) ;
20+ const idx = inorder . indexOf ( preorder [ 0 ] ) ;
21+ root . left = buildTree ( preorder . slice ( 1 , idx + 1 ) , inorder . slice ( 0 , idx ) ) ;
22+ root . right = buildTree ( preorder . slice ( idx + 1 ) , inorder . slice ( idx + 1 ) ) ;
23+
24+ return root ;
25+ }
26+
27+ // Not using slice. but I think it's not necessary... first solution is more readable. and that's not so bad.
28+ // T.C: O(N)
29+ // S.C: O(N)
30+ function buildTree ( preorder : number [ ] , inorder : number [ ] ) : TreeNode | null {
31+ // this tree is consist of unique values
32+ const inorderMap = new Map < number , number > ( ) ;
33+ for ( const [ i , val ] of inorder . entries ( ) ) {
34+ inorderMap . set ( val , i ) ;
35+ }
36+
37+ function helper ( preLeft : number , preRight : number , inLeft : number , inRight : number ) : TreeNode | null {
38+ if ( preLeft > preRight ) return null ;
39+
40+ const rootValue = preorder [ preLeft ] ;
41+ const root = new TreeNode ( rootValue ) ;
42+ const inRootIdx = inorderMap . get ( rootValue ) ! ;
43+
44+ const leftSize = inRootIdx - inLeft ;
45+
46+ root . left = helper ( preLeft + 1 , preLeft + leftSize , inLeft , inRootIdx - 1 ) ;
47+ root . right = helper ( preLeft + leftSize + 1 , preRight , inRootIdx + 1 , inRight ) ;
48+
49+ return root ;
50+ }
51+
52+ return helper ( 0 , preorder . length - 1 , 0 , inorder . length - 1 ) ;
53+ }
0 commit comments