递归法(容器分割)
前序遍历先构造中间结点,然后递归构造左子树和右子树
1、确定递归函数的参数和返回值
参数就是传⼊的是存放元素的数组,返回该数组构造的⼆叉树的头结点,返回类型是指向节点的指针。
TreeNode* constructMaximumBinaryTree(vector<int>& nums)
2、确定终⽌条件
题⽬中说了输⼊的数组⼤⼩⼀定是⼤于等于1的,所以我们不⽤考虑⼩于1的情况,那么当递归遍历的时候,如果传⼊的数组⼤⼩为1,说明遍历到了叶⼦节点了。
那么应该定义⼀个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。 这表示⼀个数组⼤⼩是1的时候,构造了⼀个新的节点,并返回。
TreeNode* node = new TreeNode(0);
if (nums.size() == 1) {
node->val = nums[0];
return node;
}
3、确定单层递归的逻辑
这⾥有三步⼯作
1.先要找到数组中最⼤的值和对应的下表,最⼤的值构造根节点,下表⽤来下⼀步分割数组。代码如下:
int maxValue = 0;
int maxValueIndex = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] > maxValue) {
maxValue = nums[i];
maxValueIndex = i;
}
}
TreeNode* node = new TreeNode(0);
node->val = maxValue;
2、最⼤值所在的下表左区间构造左⼦树
这⾥要判断maxValueIndex > 0,因为要保证左区间⾄少有⼀个数值。
if (maxValueIndex > 0) {
vector<int> newVec(nums.begin(), nums.begin() + maxValueIndex);
node->left = constructMaximumBinaryTree(newVec);}
3、最⼤值所在的下表右区间构造右⼦树
判断maxValueIndex < (nums.size() - 1),确保右区间⾄少有⼀个数值。代码如下: