Skip to content

Commit 3f90c4c

Browse files
committed
Time: 8 ms (52.67%), Space: 12.6 MB (91.65%) - LeetHub
1 parent cd58d8d commit 3f90c4c

File tree

1 file changed

+28
-15
lines changed

1 file changed

+28
-15
lines changed

1008-construct-binary-search-tree-from-preorder-traversal/1008-construct-binary-search-tree-from-preorder-traversal.cpp

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,34 @@
1111
*/
1212
class Solution {
1313
public:
14-
TreeNode* solve(vector<int>& preorder, int s, int e)
15-
{
16-
if(s>e or e>preorder.size()) return NULL;
17-
TreeNode* root = new TreeNode(preorder[s]);
18-
if(s==e)
19-
return root;
20-
TreeNode *left=NULL,*right=NULL;
21-
int idx = upper_bound(preorder.begin()+s,preorder.begin()+e+1,root->val) - preorder.begin();
22-
left = solve(preorder,s+1,idx-1);
23-
right = solve(preorder,idx,e);
24-
root->left = left;
25-
root->right = right;
26-
return root;
27-
}
2814
TreeNode* bstFromPreorder(vector<int>& preorder) {
29-
return solve(preorder,0,preorder.size()-1);
15+
if(preorder.size()==0) return NULL;
16+
stack<TreeNode*> st;
17+
TreeNode* root = new TreeNode(preorder[0]);
18+
int idx = 1;
19+
st.push(root);
20+
for(; idx<preorder.size(); idx++)
21+
{
22+
int curr = preorder[idx];
23+
auto node = st.top();
24+
if(node->val > curr)
25+
{
26+
TreeNode* newNode = new TreeNode(curr);
27+
node->left = newNode;
28+
st.push(newNode);
29+
}
30+
else
31+
{
32+
while(!st.empty() && st.top()->val<curr)
33+
{
34+
node = st.top();
35+
st.pop();
36+
}
37+
TreeNode* newNode = new TreeNode(curr);
38+
node->right = newNode;
39+
st.push(newNode);
40+
}
41+
}
42+
return root;
3043
}
3144
};

0 commit comments

Comments
 (0)