1008. Construct Binary Search Tree from Preorder Traversal
Return the root node of a binary search tree that matches the given preorder
traversal.
(Recall that a binary search tree is a binary tree where for every node, any descendant of node.left
has a value <
node.val
, and any descendant of node.right
has a value >
node.val
. Also recall that a preorder traversal displays the value of the node
first, then traverses node.left
, then traverses node.right
.)
Example 1:
Input: [8,5,1,7,10,12]
Output: [8,5,10,1,7,null,12]
Note:
1 <= preorder.length <= 100
The values of
preorder
are distinct.
TreeNode* helper(vector<int>& preorder, int L, int R) {
if (L > R) return nullptr;
TreeNode* cur = new TreeNode(preorder[L]);
if (L == R) return cur;
int i = L;
while (i < preorder.size() && preorder[i] <= preorder[L]) ++i;
cur->left = helper(preorder, L + 1, i - 1);
cur->right = helper(preorder, i, R);
return cur;
}
TreeNode* bstFromPreorder(vector<int>& preorder) { // time: O(n^2); space: O(h)
return helper(preorder, 0, preorder.size() - 1);
}
TreeNode* helper(vector<int>& preorder, int& i, int upper) {
if (i == preorder.size() || preorder[i] > upper) return nullptr;
TreeNode* root = new TreeNode(preorder[i++]);
root->left = helper(preorder, i, root->val);
root->right = helper(preorder, i, upper);
return root;
}
TreeNode* bstFromPreorder(vector<int>& preorder) { // time: O(n); space: O(h)
int i = 0;
return helper(preorder, i, INT_MAX);
}
Last updated
Was this helpful?