给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
-
二叉树的根是数组中的最大元素。
-
左子树是通过数组中最大值左边部分构造出的最大二叉树。
-
右子树是通过数组中最大值右边部分构造出的最大二叉树。
和构造二叉树思路类似使用递归求解,步骤如下:
(1)如果只有一个值直接将其作为根结点返回;
(2)找到最大值以及其在数组中的索引;
(3)分为左右两个数组;
(4)对两个数组递归求解。
实现代码如下:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
//1.如果只有一个节点直接返回节点
if(nums.size() == 1) {
int rootValue = nums[0];
TreeNode* root = new TreeNode(rootValue);
return root;
}
//2.找到数组最大值的索引
int maxIndex = 0;
int maxValue = 0;
for (int i = 0; i<nums.size(); i++) {
if (nums[i] >= maxValue) {
maxValue = nums[i];
maxIndex = i;
}
}
TreeNode* root = new TreeNode(maxValue);
//3.分为左右两个数组
if(maxIndex > 0) {
vector<int> leftnums(nums.begin(), nums.begin() + maxIndex);
root->left = constructMaximumBinaryTree(leftnums); //4.递归实现
}
if(maxIndex < (nums.size()-1)) {
vector<int> rightnums(nums.begin() + maxIndex + 1, nums.end());
root->right = constructMaximumBinaryTree(rightnums); //4.递归实现
}
return root;
}