|
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