|
1 |
| -/* |
2 |
| - Problem: https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ |
3 |
| - Description: Given two integer arrays preorder and inorder, construct and return the binary tree. |
4 |
| - Concept: Array, Hash Table, Divide and Conquer, Tree, Binary Tree |
5 |
| - Time Complexity: O(N²), Runtime 2ms |
6 |
| - Space Complexity: O(N), Memory 45.02MB |
7 |
| -*/ |
8 |
| -import java.util.HashMap; |
9 |
| -import java.util.Map; |
| 1 | +/** |
| 2 | + * <a href="https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/">week15-2. construct-binary-tree-from-preorder-and-inorder-traversal</a> |
| 3 | + * <li>Description: Given two integer arrays preorder and inorder, construct and return the binary tree</li> |
| 4 | + * <li>Topics: Array, Hash Table, Divide and Conquer, Tree, Binary Tree</li> |
| 5 | + * <li>Time Complexity: O(N), Runtime 2ms </li> |
| 6 | + * <li>Space Complexity: O(N), Memory 44.41MB</li> |
| 7 | + */ |
10 | 8 |
|
11 | 9 | class Solution {
|
12 | 10 | public TreeNode buildTree(int[] preorder, int[] inorder) {
|
13 |
| - boolean isLeft = true; |
14 |
| - Map<Integer, TreeNode> parents = new HashMap<>(); |
15 |
| - TreeNode rootNode = null, parentNode = null; |
| 11 | + Map<Integer, Integer> inorderMap = new HashMap<>(); |
| 12 | + for (int i = 0; i < inorder.length; i++) { |
| 13 | + inorderMap.put(inorder[i], i); |
| 14 | + } |
| 15 | + return buildTree(preorder, new AtomicInteger(0), inorderMap, 0, inorder.length - 1); |
| 16 | + } |
16 | 17 |
|
17 |
| - for (int pidx=0, iidx=0; pidx<preorder.length; pidx++) { |
18 |
| - int pval = preorder[pidx]; |
19 |
| - int ival = inorder[iidx]; |
| 18 | + public TreeNode buildTree(int[] preorder, AtomicInteger index, Map<Integer, Integer> inorderMap, int start, int end) { |
| 19 | + if (start > end) return null; |
20 | 20 |
|
21 |
| - if(pidx==0) { |
22 |
| - rootNode = parentNode = new TreeNode(pval); |
23 |
| - } else if (isLeft) { |
24 |
| - parents.put(pval, parentNode); |
25 |
| - parentNode = parentNode.left = new TreeNode(pval); |
26 |
| - } else { |
27 |
| - isLeft = true; |
28 |
| - parents.put(pval, parentNode); |
29 |
| - parentNode = parentNode.right = new TreeNode(pval); |
30 |
| - } |
| 21 | + int nodeValue = preorder[index.getAndIncrement()]; |
| 22 | + TreeNode node = new TreeNode(nodeValue); |
31 | 23 |
|
32 |
| - if(pval==ival) { |
33 |
| - isLeft = false; |
34 |
| - TreeNode targetNode = parentNode; |
35 |
| - while (iidx<inorder.length-1 && parents.get(parentNode.val)!=null) { |
36 |
| - if(parentNode.val == inorder[iidx+1]){ |
37 |
| - iidx++; |
38 |
| - targetNode = parentNode; |
39 |
| - } |
40 |
| - parentNode = parents.get(parentNode.val); |
41 |
| - } |
42 |
| - if(iidx<inorder.length-1 && parentNode.val != inorder[iidx+1]){ |
43 |
| - iidx++; |
44 |
| - parentNode = targetNode; |
45 |
| - } else iidx = iidx+2; |
46 |
| - } |
47 |
| - } |
| 24 | + int nodeIndex = inorderMap.get(nodeValue); |
48 | 25 |
|
49 |
| - return rootNode; |
| 26 | + node.left = buildTree(preorder, index, inorderMap, start, nodeIndex - 1); |
| 27 | + node.right = buildTree(preorder, index, inorderMap, nodeIndex + 1, end); |
| 28 | + |
| 29 | + return node; |
50 | 30 | }
|
51 | 31 | }
|
52 |
| - |
53 |
| -/** |
54 |
| - * Definition for a binary tree node. |
55 |
| - * public class TreeNode { |
56 |
| - * int val; |
57 |
| - * TreeNode left; |
58 |
| - * TreeNode right; |
59 |
| - * TreeNode() {} |
60 |
| - * TreeNode(int val) { this.val = val; } |
61 |
| - * TreeNode(int val, TreeNode left, TreeNode right) { |
62 |
| - * this.val = val; |
63 |
| - * this.left = left; |
64 |
| - * this.right = right; |
65 |
| - * } |
66 |
| - * } |
67 |
| - */ |
0 commit comments