思路一:preorder数组的第一个元素为根,然后从左到右开始找第一个大于根的元素,递归的构造左右子树,时间复杂度O(n)。
思路二:一边遍历preorder数组一边构造BST
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode *buildTree(vector<int> &preorder) {
/*O(n^2)*/
//return buildTree(preorder, 0, preorder.size()-1);
/*O(n)*/
int cur = 0;
return buildTree(preorder, cur, INT_MIN, INT_MAX);
}
TreeNode *buildTree(vector<int> &preorder, int begin, int end) {
if(begin > end) return NULL;
TreeNode *root = new TreeNode(preorder[begin]);
if(begin == end) return root;
int idx = begin+1;
while(idx <= end && preorder[idx] <= root->val) idx++;
root->left = buildTree(preorder, begin+1, idx-1);
root->right = buildTree(preorder, idx, end);
return root;
}
TreeNode *buildTree(vector<int> &preorder, int &cur, int min, int max)
{
if(cur >= preorder.size()) return NULL;
TreeNode *root = NULL;
if(preorder[cur] >= min && preorder[cur] <= max)
{
root = new TreeNode(preorder[cur]);
cur++;
root->left = buildTree(preorder, cur, min, root->val);
root->right = buildTree(preorder, cur, root->val, max);
}
return root;
}
};