- 要构造一棵树,首先想到递归,一个结点一个结点的构建(包括new该结点,并且确定root->left和root->right)
- 根据题意,一棵树的根结点是数组的最大值,因此先找到值最大的数创建一个根节点root;以该值将数组分成左右两棵子树,再对这两棵子树递归的创建它们的根结点;而root->left和root->right就是这两棵子树的根结点,这样就完整确定好了一棵树的根结点root;
class Solution {
public:
TreeNode* travel(vector<int>& nums, int BegIndex, int EndIndex){
if(BegIndex == EndIndex) return NULL;
int MaxValIndex = BegIndex;
for(int i = BegIndex + 1; i < EndIndex; ++i){
if(nums[i] > nums[MaxValIndex]){
MaxValIndex = i;
}
}
TreeNode* root = new TreeNode(nums[MaxValIndex]);
if(EndIndex - BegIndex == 1) return root;
root->left = travel(nums, BegIndex, MaxValIndex);
root->right = travel(nums, MaxValIndex + 1, EndIndex);
return root;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return travel(nums, 0, nums.size());
}
};
- 对于当前正在处理的一棵子树,可以独立用一个数组描述,但这样每层递归处理的子树都需用一个数组表示,时间+空间均不好;
优化策略:类似用数组构造二叉树的题目,每次分组尽量不要定义新的数组,而是通过一对下表索引范围直接在原数组上操作,这样可以节约时间和空间上的开销; - 注意维护循环不变量,该题使用[ ),不同的区间不变量所对应的条件判断也是不同的,只需要从头到尾按照一个走即可;
- 递归函数头部的if判空条件,一般情况来说:如果让空节点(空指针)进入递归,就不加if,如果不让空节点进入递归,就加if限制一下, 终止条件也会相应的调整;