中難易度242
繰り返される要素のない整数配列が与えられます
nums
。この配列から直接再帰的に構築される最大二分木は 、次のように定義されます。
- 二分木のルートは
nums
、配列 内の最大の要素です。- 左側のサブツリーは、配列の 最大値の左側の部分 から再帰的に構築された最大の二分木です。
- 右側のサブツリーは、配列の 最大値の右側の部分 から再帰的に構築された最大の二分木です。
指定された配列で
nums
構築された 最大の二分木を 返します 。
例1:
入力: nums = [3,2,1,6,0,5] 出力: [6,3,5、null、2,0、null、null、1] 説明:再帰呼び出しは次のとおりです: -[3 、2,1,6,0,5]の最大値は6で、左側は[3,2,1]、右側は[0,5]です。 -[3,2,1]の最大値は3、左側は[]、右側は[2,1]です。 -空の配列、子ノードはありません。 -[2,1]の最大値は2、左側は[]、右側は[1]です。 -空の配列、子ノードはありません。 -要素は1つしかないため、子ノードは値が1のノードです。 -[0,5]の最大値は5、左側は[0]、右側は[]です。 -要素は1つしかないため、子ノードは値が0のノードです。 -空の配列、子ノードはありません。例2:
入力: nums = [3,2,1] 出力: [3、null、2、null、1]
促す:
1 <= nums.length <= 1000
0 <= nums[i] <= 1000
nums
のすべての整数は互いに異なります
再帰
/**
* 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);
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> newVec(nums.begin(), nums.begin() + maxValueIndex);
node->left = constructMaximumBinaryTree(newVec);
}
if(maxValueIndex < (nums.size()-1)){
vector<int> newVec(nums.begin() + maxValueIndex + 1, nums.end());
node->right = constructMaximumBinaryTree(newVec);
}
return node;
}
};