一:题目
二:思路
1.这是构造二叉树,我们一般通过前序遍历来构造二叉树
2.我们是通过找到一个最大值,这个最大值的所对应下标的右边是右子树,下标的左边是左子树
3.通过递归构造二叉树
1>:递归函数的参数和返回值
TreeNode* constructMaximumBinaryTree(vector& nums)
(我们返回的是一个指针所以是 TreeNode*类型的)
2>:递归函数的终止条件
如果 数组元素就剩下一个元素,那么的话就可以终止了
if(nums.size() == 1) {
node->val = nums[0];//剩下一个元素就是下标为0的元素了
return node;
}
3>:递归体
我们每次递归需要选出一个最大值和最大值对应的下标因为我们需要进行分割
int maxValue = 0;
int maxValueIndex;
for(int i = 0; i < nums.size(); i++) {
if(nums[i] > maxValue) {
maxValue = nums[i];
macValueIndex = i;
}
}
node->val = maxValue;//中
//递归建立左子树
vector vec1(nums.begin(),nums.begin()+maxValueIndex);
node->left = constructMaximumBinaryTree(vec1);
//递归建立右子树
vector vec2(nums.begin()+maxValueIndex+1,nums.size()-1);
node->right = constructMaximumBinaryTree(vec2);
三:上码
/**
* 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:
/**
思路:1.这是构造二叉树,我们一般通过前序遍历来构造二叉树
2.我们是通过找到一个最大值,这个最大值的所对应下标的右边是右子树,下标的左边是左子树
3.通过递归构造二叉树
1>:递归函数的参数和返回值
TreeNode* constructMaximumBinaryTree(vector<int>& nums)
(我们返回的是一个指针所以是 TreeNode*类型的)
2>:递归函数的终止条件
如果 数组元素就剩下一个元素,那么的话就可以终止了
if(nums.size() == 1) {
node->val = nums[0];//剩下一个元素就是下标为0的元素了
return node;
}
3>:递归体
我们每次递归需要选出一个最大值和最大值对应的下标因为我们需要进行分割
int maxValue = 0;
int maxValueIndex;
for(int i = 0; i < nums.size(); i++) {
if(nums[i] > maxValue) {
maxValue = nums[i];
macValueIndex = i;
}
}
node->val = maxValue;//中
//递归建立左子树
vector<int> vec1(nums.begin(),nums.begin()+maxValueIndex);
node->left = constructMaximumBinaryTree(vec1);
//递归建立右子树
vector<int> vec2(nums.begin()+maxValueIndex+1,nums.size()-1);
node->right = constructMaximumBinaryTree(vec2);
*/
TreeNode* constructMaximumBinaryTree2(vector<int>& nums) {
TreeNode* node = new TreeNode(0);
if(nums.size() == 1) {
node->val = nums[0];//剩下一个元素就是下标为0的元素了
return node;
}
int maxValue = 0;
int maxValueIndex;
for(int i = 0; i < nums.size(); i++) {
if(nums[i] > maxValue) {
maxValue = nums[i];
maxValueIndex = i;
}
}
node->val = maxValue;//中
//递归建立左子树
if(maxValueIndex > 0){//保证左区间至少一个值
vector<int> vec1(nums.begin(),nums.begin()+maxValueIndex);
node->left = constructMaximumBinaryTree2(vec1);
}
//递归建立右子树
if(maxValueIndex < nums.size()-1){//保证右区间至少一个值 比如nums.size()=5那么下标最大值是4 Index < 4
vector<int>vec2(nums.begin()+maxValueIndex+1,nums.end());//那么的话就是右区间至少一个元素
node->right = constructMaximumBinaryTree2(vec2); //这样加if条件就是避免了空节点的导入
}
return node;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return constructMaximumBinaryTree2(nums);
}
};