leetcode:654. 最大二叉树
题目
给定一个不重复的整数数组 nums
。 最大二叉树 可以用下面的算法从 nums
递归地构建:
- 创建一个根节点,其值为 nums 中的最大值。
- 递归地在最大值 左边 的 子数组前缀上 构建左子树。
- 递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums
构建的 最大二叉树 。
示例:
输入:s1 = "ab" s2 = "eidbaooo"
输出:true
解释:s2 包含 s1 的排列之一 ("ba").
输入:s1= "ab" s2 = "eidboaoo"
输出:false
解答 & 代码
/**
* 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 {
private:
TreeNode* buildTree(vector<int> nums, int left, int right)
{
if(left > right)
return nullptr;
// 1. 找到最大值的下标,作为根节点
int rootIdx = left;
for(int i = left + 1; i <= right; ++i)
{
if(nums[i] > nums[rootIdx])
rootIdx = i;
}
TreeNode* root = new TreeNode(nums[rootIdx]);
// 2. 递归构建左、右子树
root->left = buildTree(nums, left, rootIdx - 1);
root->right = buildTree(nums, rootIdx + 1, right);
return root;
}
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return buildTree(nums, 0, nums.size() - 1);
}
};
复杂度分析:设二叉树节点数为 N(数组 nums
长为 N)
- 时间复杂度
:会调用 N 次
buildTree()
函数来构建 N 个节点,每次都要遍历对应的子数组寻找最大值作为根节点 - 空间复杂度 O(logN):递归栈空间复杂度 = 递归深度 = 树深度
执行结果:
执行结果:通过
执行用时:148 ms, 在所有 C++ 提交中击败了 6.00% 的用户
内存消耗:370.9 MB, 在所有 C++ 提交中击败了 5.00% 的用户