https://leetcode.cn/problems/maximum-binary-tree/
思路:找到数组中的最大值,然后取最大值左边的数组为左子树,最大值右边的数组为右子树,所以我们自然而然的想到了使用递归的方法。那么我们考虑递归三要素:
确立参数和返回条件:由于二叉树是遍历整棵数,参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。所以我们使用TreeNode进行设定:
TreeNode* traversal(vector<int>& nums)
确定终止条件:
题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。这个时候我们应该返回根节点,但是这道题是构造二叉树,并没有给出根节点,所以我们应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。 这表示一个数组大小是1的时候,构造了一个新的节点,并返回。
TreeNode* node = new TreeNode(0);
if (nums.size() == 1) {
node->val = nums[0];
return node;
}
单层递归逻辑:
我们要考虑左子树右子树的单层递归逻辑,这里有三个任务,首先找到最大值,然后确立最大值左右数组,再进行递归。
int maxValue = 0;
int maxValueIndex = 0;
for(int i = 0; i < nums.size(); i++){
if( nums[i] > maxValue){
maxValue = nums[i];
maxValueIndex = i;
}
}
node -> val = maxValue;
if(maxValueIndex > 0){
//注意左子树递归是有前提的,也就是最大值所在的下标一定要大于0,否则就会有空地址访问。
vector<int> left(nums.begin(),nums.begin() + maxValueIndex);
node -> left = traversal(left);
}
//注意右子树递归是也是有前提的
if(maxValueIndex < nums.size() - 1){
vector<int> right(nums.begin() + maxValueIndex + 1,nums.end());
node -> right = traversal(right);
}
return node;
}
全部代码:
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traversal(nums);
}
TreeNode* traversal(vector<int>& nums){
TreeNode* node = new TreeNode(0);
if(nums.size() == 1){
node -> val = nums[0];
return node;
}
int maxValue = 0;
int maxValueIndex = 0;
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> left(nums.begin(),nums.begin() + maxValueIndex);
node -> left = traversal(left);
}
if(maxValueIndex < nums.size() - 1){
vector<int> right(nums.begin() + maxValueIndex + 1,nums.end());
node -> right = traversal(right);
}
return node;
}
};