题目:
给定一个不重复的整数数组 nums
。 最大二叉树 可以用下面的算法从 nums
递归地构建:
- 创建一个根节点,其值为
nums
中的最大值。 - 递归地在最大值 左边 的 子数组前缀上 构建左子树。
- 递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums
构建的 最大二叉树 。
示例:
- 输入: n u m s = [ 3 , 2 , 1 , 6 , 0 , 5 ] nums = [3,2,1,6,0,5] nums=[3,2,1,6,0,5]
- 输出: [ 6 , 3 , 5 , n u l l , 2 , 0 , n u l l , n u l l , 1 ] [6,3,5,null,2,0,null,null,1] [6,3,5,null,2,0,null,null,1]
解题思路:(递归 )
-
找到数组中最大值及对应下标:
int splitIdx = 0, maxNum = INT_MIN; for(int i = 0; i < nums.size(); i++){ if(maxNum < nums[i]){ maxNum = nums[i]; splitIdx = i; } }
-
用最大值所在下标划分左子树区间并进行递归:
if(splitIdx > 0){ vector<int> leftTree(nums.begin(), nums.begin() + splitIdx); node->left = dfs(leftTree); }
-
用最大值所在下标划分右子树区间并进行递归:
if(splitIdx < nums.size() - 1){ vector<int> rightTree(nums.begin() + splitIdx + 1, nums.end()); node->right = dfs(rightTree); }
C++版整体代码
class Solution {
public:
TreeNode* dfs(vector<int>& nums){
TreeNode* node = new TreeNode(0);
if(nums.size() == 1){
node->val = nums[0];
return node;
}
int splitIdx = 0, maxNum = INT_MIN;
for(int i = 0; i < nums.size(); i++){
if(maxNum < nums[i]){
maxNum = nums[i];
splitIdx = i;
}
}
node->val = maxNum;
if(splitIdx > 0){
vector<int> leftTree(nums.begin(), nums.begin() + splitIdx);
node->left = dfs(leftTree);
}
if(splitIdx < nums.size() - 1){
vector<int> rightTree(nums.begin() + splitIdx + 1, nums.end());
node->right = dfs(rightTree);
}
return node;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
if(nums.size() == 0) return NULL;
return dfs(nums);
}
};
使用下标优化代码
class Solution {
public:
TreeNode* dfs(vector<int>& nums, int left, int right){
if(left >= right){
return NULL;
}
int maxIdx = left;
for(int i = left + 1; i < right; i++){
if(nums[i] > nums[maxIdx]) maxIdx = i;
}
TreeNode* node = new TreeNode(nums[maxIdx]);
node->left = dfs(nums, left, maxIdx);
node->right = dfs(nums, maxIdx + 1, right);
return node;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return dfs(nums, 0, nums.size());
}
};