Leetcode654
链接:力扣 。
题目:
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
- 二叉树的根是数组中的最大元素。
- 左子树是通过数组中最大值左边部分构造出的最大二叉树。
- 右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构建最大二叉树,并且输出这个树的根节点。
示例:
思路:
采用前序遍历的思路来做。对于建立一个二叉树,我们要先建立其根结点,然后如此递归的建立其左子树和右子树。
我们根据这个思路将其细化。
1.递归函数的返回值和参数。
每一层递归都要建立以当前最大值为根的二叉树,建立后我们要将子树的根结点返回以提供给上层使用,故返回值采用TreeNode*的指针类型。为了找到当前的最大值,我们不仅要将数组nums传入参数,还需要一个确切的范围[left, right)来确定当前子树结点的范围,同时当前最大值的范围也在该左闭右开区间内寻找。故函数参数共三个(vector<int>& nums, int left, int right)。
2.单层递归逻辑。
对于给定区间[left, right),我们直接遍历该区间内每一个元素,找到其最大值的下标index。以最大值nums[index]建立根结点node,然后将区间又分为左半[left, index)和右半[index+1, right)。然后递归进入左半区间,将其返回结点赋于node的左孩子,递归进入右半区间返回值赋于node的右孩子。
3.递归边界。
当传入参数left >= right的时候,表示区间[left, right)里面已经没有数了,即该子树应为一棵空树。故直接返回nullptr。
参考代码:
/**
* 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* traversal (vector<int>& nums, int left, int right) {
if (left >= right) {
return nullptr;
}
int index = left;
for (int i = left; i < right; i++) {
if (nums[i] > nums[index]) {
index = i;
}
}
TreeNode *node = new TreeNode(nums[index]);
node->left = traversal(nums, left, index);
node->right = traversal(nums, index + 1, right);
return node;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traversal(nums, 0, nums.size());
}
};