Skip to content

Commit 0307571

Browse files
committed
feat: construct-binary-tree-from-preorder-and-inorder-traversal
1 parent b69aa8a commit 0307571

File tree

1 file changed

+22
-58
lines changed
  • construct-binary-tree-from-preorder-and-inorder-traversal

1 file changed

+22
-58
lines changed
Lines changed: 22 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,31 @@
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+
*/
108

119
class Solution {
1210
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+
}
1617

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;
2020

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);
3123

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);
4825

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;
5030
}
5131
}
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

Comments
 (0)