题目:https://leetcode-cn.com/problems/maximum-binary-tree/
思路一 :递归
分析:找到数组最大值,则其值一定为根节点,创建根节点最大值左面是左子树,找到左子树最大值,创建左子树根节点,然后再找到左子树的左子树,再找到最大值,创建节点,一层一层递归下去,右子树的方式相同
递归三部曲:
-
确定函数参数和返回值
数组为函数参数,返回值是根节点
-
确定终止条件
数组为空就返回
-
单层逻辑
找到数组里面的最大值和其位置
然后创建根节点,里面的值为最大值
创建一个新数组,里面放左子树
递归创建左子树,右子树方式相同
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
TreeNode* root=NULL;
if(nums.size()==0)
return NULL;
//找最大值
int maxnum=*max_element(nums.begin(),nums.end());
auto pos=max_element(nums.begin(),nums.end());
int j=distance (begin(nums), pos);
root=new TreeNode(maxnum);
//左子树
vector<int>leftnums(nums.begin(),nums.begin()+j);
root->left=constructMaximumBinaryTree(leftnums);
//右子树
vector<int>rightnums(nums.begin()+j+1,nums.end());
root->right=constructMaximumBinaryTree(rightnums);
return root;
}
思路二:递归优化
每次分割不用定义新的数组而是通过下表索引直接在原数组上操作
class Solution {
private:
// 在左闭右开区间[left, right),构造二叉树
TreeNode* traversal(vector<int>& nums, int left, int right) {
if (left >= right) return nullptr;
// 分割点下表:maxValueIndex
int maxValueIndex = left;
for (int i = left + 1; i < right; ++i) {
if (nums[i] > nums[maxValueIndex]) maxValueIndex = i;
}
TreeNode* root = new TreeNode(nums[maxValueIndex]);
// 左闭右开:[left, maxValueIndex)
root->left = traversal(nums, left, maxValueIndex);
// 左闭右开:[maxValueIndex + 1, right)
root->right = traversal(nums, maxValueIndex + 1, right);
return root;
}
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traversal(nums, 0, nums.size());
}
};