@@ -142,6 +142,45 @@ class Solution {
142
142
}
143
143
```
144
144
145
+ ``` csharp
146
+ /**
147
+ * Definition for a binary tree node.
148
+ * public class TreeNode {
149
+ * public int val;
150
+ * public TreeNode left;
151
+ * public TreeNode right;
152
+ * public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
153
+ * this.val = val;
154
+ * this.left = left;
155
+ * this.right = right;
156
+ * }
157
+ * }
158
+ */
159
+ public class Solution {
160
+ public TreeNode BuildTree (int [] inorder , int [] postorder ) {
161
+ if (postorder .Length == 0 || inorder .Length == 0 ) {
162
+ return null ;
163
+ }
164
+
165
+ int rootVal = postorder [postorder .Length - 1 ];
166
+ TreeNode root = new TreeNode (rootVal );
167
+
168
+ int mid = Array .IndexOf (inorder , rootVal );
169
+
170
+ int [] leftInorder = inorder [.. mid ];
171
+ int [] rightInorder = inorder [(mid + 1 ).. ];
172
+
173
+ int [] leftPostorder = postorder [.. mid ];
174
+ int [] rightPostorder = postorder [mid .. ^ 1 ];
175
+
176
+ root .left = BuildTree (leftInorder , leftPostorder );
177
+ root .right = BuildTree (rightInorder , rightPostorder );
178
+
179
+ return root ;
180
+ }
181
+ }
182
+ ```
183
+
145
184
:: tabs-end
146
185
147
186
### Time & Space Complexity
@@ -301,6 +340,47 @@ class Solution {
301
340
}
302
341
```
303
342
343
+ ``` csharp
344
+ /**
345
+ * Definition for a binary tree node.
346
+ * public class TreeNode {
347
+ * public int val;
348
+ * public TreeNode left;
349
+ * public TreeNode right;
350
+ * public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
351
+ * this.val = val;
352
+ * this.left = left;
353
+ * this.right = right;
354
+ * }
355
+ * }
356
+ */
357
+ public class Solution {
358
+ int [] postorder ;
359
+ Dictionary <int , int > inorderIdx ;
360
+ int idx ;
361
+
362
+ public TreeNode BuildTree (int [] inorder , int [] postorder ) {
363
+ this .postorder = postorder ;
364
+ inorderIdx = new Dictionary <int , int >();
365
+ for (int i = 0 ; i < inorder .Length ; i ++ ) {
366
+ inorderIdx [inorder [i ]] = i ;
367
+ }
368
+ idx = postorder .Length - 1 ;
369
+ return Dfs (0 , inorder .Length - 1 );
370
+ }
371
+
372
+ private TreeNode Dfs (int l , int r ) {
373
+ if (l > r ) return null ;
374
+
375
+ TreeNode root = new TreeNode (postorder [idx -- ]);
376
+ int i = inorderIdx [root .val ];
377
+ root .right = Dfs (i + 1 , r );
378
+ root .left = Dfs (l , i - 1 );
379
+ return root ;
380
+ }
381
+ }
382
+ ```
383
+
304
384
:: tabs-end
305
385
306
386
### Time & Space Complexity
@@ -468,9 +548,49 @@ class Solution {
468
548
}
469
549
```
470
550
551
+ ``` csharp
552
+ /**
553
+ * Definition for a binary tree node.
554
+ * public class TreeNode {
555
+ * public int val;
556
+ * public TreeNode left;
557
+ * public TreeNode right;
558
+ * public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
559
+ * this.val = val;
560
+ * this.left = left;
561
+ * this.right = right;
562
+ * }
563
+ * }
564
+ */
565
+ public class Solution {
566
+ int postIdx , inIdx ;
567
+ int [] inorder , postorder ;
568
+
569
+ public TreeNode BuildTree (int [] inorder , int [] postorder ) {
570
+ this .inorder = inorder ;
571
+ this .postorder = postorder ;
572
+ postIdx = inIdx = postorder .Length - 1 ;
573
+ return Dfs (int .MaxValue );
574
+ }
575
+
576
+ private TreeNode Dfs (int limit ) {
577
+ if (postIdx < 0 ) return null ;
578
+ if (inorder [inIdx ] == limit ) {
579
+ inIdx -- ;
580
+ return null ;
581
+ }
582
+
583
+ TreeNode root = new TreeNode (postorder [postIdx -- ]);
584
+ root .right = Dfs (root .val );
585
+ root .left = Dfs (limit );
586
+ return root ;
587
+ }
588
+ }
589
+ ```
590
+
471
591
:: tabs-end
472
592
473
593
### Time & Space Complexity
474
594
475
595
- Time complexity: $O(n)$
476
- - Space complexity: $O(n)$ for recursion stack.
596
+ - Space complexity: $O(n)$ for recursion stack.
0 commit comments