一、终于用上了单调栈,感觉还行,思路相当的清晰,写起来很快
1 TreeNode* bstFromPreorder(vector<int>& preorder) { 2 int size = preorder.size(); 3 if (size == 0) 4 return nullptr; 5 TreeNode* root = new TreeNode(preorder[0]); 6 stack<TreeNode*> use; 7 use.push(root); 8 TreeNode* last = root; 9 for (int i = 1; i < size; ++i) 10 { 11 TreeNode* t = new TreeNode(preorder[i]); 12 if (t->val > use.top()->val) 13 { 14 while (!use.empty() && t->val > use.top()->val) 15 { 16 last = use.top(); 17 use.pop(); 18 } 19 last->right = t; 20 } 21 else 22 { 23 use.top()->left = t; 24 } 25 use.push(t); 26 } 27 return root; 28 }
二、递归
1 TreeNode* recur(vector<int>& preorder, int up, int down) 2 { 3 if (up > down) 4 return nullptr; 5 else if (up == down) 6 return new TreeNode(preorder[up]); 7 TreeNode* root = new TreeNode(preorder[up]); 8 int index = up+1; 9 for (; index <= down; ++index) 10 { 11 if (preorder[index] > preorder[up]) 12 { 13 break; 14 } 15 } 16 root->left = recur(preorder, up + 1, index - 1); 17 root->right = recur(preorder, index, down); 18 return root; 19 } 20 TreeNode* bstFromPreorder(vector<int>& preorder) { 21 int size = preorder.size(); 22 if (size == 0) 23 return nullptr; 24 int up = 0; 25 int down = size - 1; 26 TreeNode* root = recur(preorder, up, down); 27 return root; 28 }