这里一定要审题清楚,我最初开始写的时候没看清楚,直接一波sort然后就开始建树了,然后就zz了
1 递归(未优化)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void traverse(TreeNode* root, vector<int>& nums, int left, int right) {
int max_index = left;
for (int i=left; i <= right; i++)
if (nums[i] > nums[max_index]) {
max_index = i;
}
root->val = nums[max_index];
if (left < max_index) {
root->left = new TreeNode(0);
traverse(root->left, nums, left, max_index - 1);
}
if (max_index < right) {
root->right = new TreeNode(0);
traverse(root->right, nums, max_index + 1, right);
}
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
if (nums.empty()) return nullptr;
auto root = new TreeNode(0);
traverse(root, nums, 0, nums.size() - 1);
return root;
}
};
2 递归(已优化)
class Solution {
public:
TreeNode* traverse(vector<int>& nums, int left, int right) {
if (left > right) return nullptr;
int max_index = left;
for (int i=left;i <= right;i++)
if (nums[i] > nums[max_index])
max_index = i;
auto root = new TreeNode(nums[max_index]);
root->left = traverse(nums, left, max_index - 1);
root->right = traverse(nums, max_index + 1, right);
return root;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traverse(nums, 0, nums.size() - 1);
}
};