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% 的用户
