题解:
递归:前序遍历
递归三部曲:
1、确定递归函数的参数和返回值
参数为给定的整数数组,返回值为该整数数组构造的最大二叉树(根结点)
2、确定递归的终止条件
当数组大小为1时,说明到了叶子结点,则构造新结点赋值并返回
3、确定单层递归逻辑
找到数组的最大值和下标,作为当前根节点构造二叉树(最大值左边是左子树,最大值右边是右子树,),根据下标分割数组,递归构造左右子树
/**
* 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);
//数组长度为1
if(nums.size() == 1){
node->val = nums[0];
return node;
}
//找到数组中的最大值和最大值对应的下标
int maxValue = -1;
int maxValueIndex = 0;
for(int i = 0;i<nums.size();i++){
if(nums[i]>maxValue){
maxValue = nums[i];
maxValueIndex = i;
}
}
//最大值赋值给根结点值
node->val = maxValue;
//分割数组 确保下标大于0,小于nums.size()-1
if(maxValueIndex>0){
vector<int> leftnums(nums.begin(),nums.begin()+maxValueIndex);
//递归
node->left = constructMaximumBinaryTree(leftnums);
}
if(maxValueIndex<nums.size()-1){
vector<int> rightnums(nums.begin()+maxValueIndex+1,nums.end());
//递归
node->right = constructMaximumBinaryTree(rightnums);
}
return node;
}
};
每次递归时都定义了新的vector,优化后,可将数组索引作为参数,在左闭右开区间[left,right)中构造二叉树
class Solution {
public:
TreeNode* traversal(vector<int>& nums,int left,int right){
//终止条件
if(left>=right){
return NULL;
}
//最大值下标
int maxVauleIndex = left;
for(int i = left+1;i<right;i++){
if(nums[i]>nums[maxVauleIndex]){
maxVauleIndex = i;
}
}
//根结点赋值
TreeNode* root = new TreeNode(nums[maxVauleIndex]);
//递归构造
root->left = traversal(nums,left,maxVauleIndex);
root->right = traversal(nums,maxVauleIndex+1,right);
return root;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traversal(nums,0,nums.size());
}
};
递归函数前是否加if,一般情况来说:如果让空节点(空指针)进入递归,就不加if,如果不让空节点进入递归,就加if限制一下, 终止条件也会相应的调整。