645、最大二叉树
题目描述
给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。
数组长度大于等于1
思路
常规思路:
- 找到最大值和最大值的下标,根据这个值构建跟节点
- 根据最大值下标分割数组为左子数组、右子数组
- 根据左子数组递归的构造左子树、根据右子数组递归的构造右子树
代码实现思路:
- 参数和返回值:传入数组;返回值为指向节点的指针。
- 终止条件:因为数组长度大于等于1,所以当数组长度为1时,做完相关操作之后返回结果。
- 递归逻辑:每次构造完根节点之后,按先序遍历顺序,先构造左子树、再构造右子树。
代码
/**
* 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) {
// 数组长度>=1,所以直接创建新节点
TreeNode* root = new TreeNode(0);
// 终止条件:数组长度=1
if (nums.size() == 1) {
root -> val = nums[0];
return root;
}
// 找到数组中最大值及其小标
int maxValue = 0;
int maxIndex = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] > maxValue) {
maxIndex = i;
maxValue = nums[i];
}
}
// 构造根节点
root -> val = maxValue;
// 分割左子数组,递归构造左子树
if (maxIndex > 0) {
vector<int> newVec(nums.begin(), nums.begin() + maxIndex);
root -> left = constructMaximumBinaryTree(newVec);
}
// 分割右子数组,递归构造右子树
if (maxIndex < (nums.size() - 1)) {
vector<int> newVec(nums.begin() + maxIndex + 1, nums.end());
root -> right = constructMaximumBinaryTree(newVec);
}
return root;
}
};