/**
* 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:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
TreeNode* node= new TreeNode(0);
if(nums.size() == 1){
node->val= nums[0];
return node;
}
int maxdic= 0;
int maxvalue= 0;
for(int i= 0;i< nums.size();i++)
{
if(nums[i]> maxvalue) {
maxvalue= nums[i];
maxdic= i;
}
}
node->val = maxvalue;
if(maxdic > 0)
{
vector<int> newvec(nums.begin() , nums.begin() + maxdic);
node->left = constructMaximumBinaryTree(newvec);
}
if(maxdic < (nums.size()-1))
{
vector<int> newvec(nums.begin() + maxdic + 1 , nums.end());
node->right = constructMaximumBinaryTree(newvec);
}
return node;
}
};
解题思路:这道题的递归终止条件是输入的数组中元素数量为1,然后需要找到这个数组中的最大值以及下标,然后需要判断这个下标大于0,小于最后一位,这样是为了防止左右两侧没有数字,最后返回节点即可。
优化后的代码
class Solution {
private:
// 在左闭右开区间[left, right),构造二叉树
TreeNode* traversal(vector<int>& nums, int left, int right) {
if (left >= right) return nullptr;
// 分割点下标:maxValueIndex
int maxValueIndex = left;
for (int i = left + 1; i < right; ++i) {
if (nums[i] > nums[maxValueIndex]) maxValueIndex = i;
}
TreeNode* root = new TreeNode(nums[maxValueIndex]);
// 左闭右开:[left, maxValueIndex)
root->left = traversal(nums, left, maxValueIndex);
// 左闭右开:[maxValueIndex + 1, right)
root->right = traversal(nums, maxValueIndex + 1, right);
return root;
}
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traversal(nums, 0, nums.size());
}
};