Skip to content

Commit f05da5c

Browse files
committed
feat: construct binary tree from preorder and inorder traversal
1 parent a128555 commit f05da5c

File tree

1 file changed

+67
-0
lines changed
  • construct-binary-tree-from-preorder-and-inorder-traversal

1 file changed

+67
-0
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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(NM), Runtime 2ms
6+
Space Complexity: O(N), Memory 45.02MB
7+
*/
8+
import java.util.HashMap;
9+
import java.util.Map;
10+
11+
class Solution {
12+
public TreeNode buildTree(int[] preorder, int[] inorder) {
13+
boolean isLeft = true;
14+
Map<Integer, TreeNode> parents = new HashMap<>();
15+
TreeNode rootNode = null, parentNode = null;
16+
17+
for (int pidx=0, iidx=0; pidx<preorder.length; pidx++) {
18+
int pval = preorder[pidx];
19+
int ival = inorder[iidx];
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+
}
31+
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+
}
48+
49+
return rootNode;
50+
}
51+
}
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)