Skip to content

Commit 540dee7

Browse files
authored
[24 May, 2020] add cpp solution2
Add solution with interpolation search Iterative, time : ~O(n log logn), space : O(n)
1 parent 5f38168 commit 540dee7

File tree

1 file changed

+44
-1
lines changed

1 file changed

+44
-1
lines changed

May-LeetCoding-Challenge/24-Construct-Binary-Search-Tree-From-Preorder-Traversal/Construct-Binary-Search-Tree-From-Preorder-Traversal.cpp

+44-1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,47 @@ class Solution {
1313
TreeNode* bstFromPreorder(vector<int>& preorder) {
1414
return construct(0, preorder.size() - 1, preorder);
1515
}
16-
};
16+
};
17+
18+
class Solution2 {
19+
public:
20+
/* iterative, time : ~O(n log logn), space : O(n) */
21+
TreeNode* bstFromPreorder(vector<int>& preorder) {
22+
TreeNode **v = new TreeNode*[preorder.size()];
23+
int curr_val, root_val = preorder[0];
24+
int pos = 0;
25+
TreeNode *root = new TreeNode(root_val);
26+
TreeNode *node = root;
27+
v[0] = root;
28+
29+
for (int i = 1; i < preorder.size() ; ++i) {
30+
curr_val = preorder[i];
31+
if (preorder[i-1] > curr_val) {
32+
node->left = new TreeNode(curr_val);
33+
node = node->left;
34+
v[++pos] = node;
35+
} else { /* find the target father node */
36+
if (curr_val > root_val) {
37+
pos = 0;
38+
root_val = curr_val;
39+
} else {
40+
/* interpolation search, do more time if data is large */
41+
pos = ((curr_val - root_val) * (pos)) / (v[pos]->val - root_val);
42+
pos = max(0, pos);
43+
44+
/* target is near pos */
45+
if (v[pos]->val > curr_val) {
46+
while (v[++pos]->val > curr_val);
47+
} else {
48+
while (curr_val > v[--pos]->val);
49+
++pos;
50+
}
51+
}
52+
node = new TreeNode(curr_val);
53+
v[pos]->right = node;
54+
v[pos] = node;
55+
}
56+
}
57+
return root;
58+
}
59+
};

0 commit comments

Comments
 (0)