1
+ /**
2
+ * Definition for a binary tree node.
3
+ * public class TreeNode {
4
+ * int val;
5
+ * TreeNode left;
6
+ * TreeNode right;
7
+ * TreeNode() {}
8
+ * TreeNode(int val) { this.val = val; }
9
+ * TreeNode(int val, TreeNode left, TreeNode right) {
10
+ * this.val = val;
11
+ * this.left = left;
12
+ * this.right = right;
13
+ * }
14
+ * }
15
+ */
16
+ class Solution {
17
+ public TreeNode buildTree (int [] preorder , int [] inorder ) {
18
+ Map <Integer , Integer > inValToInIdx = new HashMap <>();
19
+ for (int i = 0 ; i < inorder .length ; i ++) {
20
+ inValToInIdx .put (inorder [i ], i );
21
+ }
22
+ return build (preorder , inValToInIdx , 0 , preorder .length - 1 , 0 , inorder .length - 1 , preorder .length );
23
+ }
24
+
25
+ public TreeNode build (int [] preorder , Map <Integer , Integer > inValToInIdx , int preLeft , int preRight , int inLeft , int inRight , int length ) {
26
+ if (length < 1 ) {
27
+ return null ;
28
+ }
29
+ TreeNode node = new TreeNode (preorder [preLeft ]);
30
+ Integer inIdx = inValToInIdx .get (preorder [preLeft ]);
31
+ int leftLength = inIdx - inLeft ;
32
+ int rightLength = length - leftLength - 1 ;
33
+ node .left = build (preorder , inValToInIdx , preLeft + 1 , preLeft + leftLength , inLeft , inIdx - 1 , leftLength );
34
+ node .right = build (preorder , inValToInIdx , preLeft + leftLength + 1 , preRight , inIdx + 1 , inRight , rightLength );
35
+ return node ;
36
+ }
37
+ }
38
+
39
+ // time O(n), due to O(1) find in hashmap but recursion n times
40
+ // space O(n), due to hashmap or building tree or recursion
41
+ // using tree and divide and conquer and re-build tree (top-down)
42
+ /*
43
+ preorder: first value is root
44
+ inorder: every value before root is left subtree, after root is right subtree
45
+ */
0 commit comments