思路一: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;
}
};