力扣654最大二叉树(C++)
思路
构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。
确定递归函数的参数和返回值
参数就是传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。
确定终止条件
题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。
那么应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。 这表示一个数组大小是1的时候,构造了一个新的节点,并返回。
确定单层递归的逻辑,这里有三步工作
1.先要找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组。
2.最大值所在的下标左区间 构造左子树
这里要判断maxValueIndex > 0,因为要保证左区间至少有一个数值。
3.最大值所在的下标右区间 构造右子树
判断maxValueIndex < (nums.size() - 1),确保右区间至少有一个数值。
代码如下
class Solution
{
public:
TreeNode *constructMaximumBinaryTree(vector<int> &nums)
{
TreeNode *node = new TreeNode(0);
if (nums.size() == 1)
{
node->val = nums[0];
return node;
}
//找到数组中最大的值和对应的下标
int maxValue = 0;
int maxValueIndex = 0;
for (int i = 0; i < nums.size(); i++)
{
if (nums[i] > maxValue)
{
maxValue = nums[i];
maxValueIndex = i;
}
}
node->val = maxValue;
//最大值所在的下标左区间,构造左子树
if (maxValueIndex > 0)
{
vector<int> newVec(nums.begin(), nums.begin() + maxValueIndex);
node->left = constructMaximumBinaryTree(newVec);
}
//最大值所在的下标右区间,构造右子树
if (maxValueIndex < (nums.size()-1))
{
vector<int> newVec(nums.begin() + maxValueIndex + 1, nums.end());
node->right = constructMaximumBinaryTree(newVec);
}
return node;
}
};
代码运行结果