TreeNode* constructMaximumBinaryTree(vector<int>& nums) { TreeNode* ret = NULL; if (nums.size() == 0) return ret; auto maximum = max_element(nums.begin(), nums.end()); int dis = distance(nums.begin(), maximum); ret = new TreeNode(*maximum); vector<int> left(nums.begin(), nums.begin() + dis); vector<int> right(nums.begin() + dis + 1, nums.end()); ret->left = constructMaximumBinaryTree(left); ret->right = constructMaximumBinaryTree(right); return ret; }
TreeNode* constructMaximumBinaryTree(vector<int>& nums, int l, int r) { if (l == r) { return nullptr; } else if (l + 1 == r) { return new TreeNode(nums[l]); } int idx = l; for (int i = l + 1; i < r; i++) { if (nums[idx] < nums[i]) { idx = i; } } TreeNode* root = new TreeNode(nums[idx]); root->left = constructMaximumBinaryTree(nums, l, idx); root->right = constructMaximumBinaryTree(nums, idx + 1, r); return root; }
TreeNode* insertIntoMaxTree(TreeNode* root, int val) { vector<int> original_list = findOriginalList(root); original_list.push_back(val); return constructMaximumBinaryTree(original_list); }
TreeNode* constructMaximumBinaryTree(vector<int>& nums) { int n = nums.size(); return constructMaximumBinaryTree(nums, 0, n); }