题目地址
https://leetcode-cn.com/problems/maximum-binary-tree/
题目描述:最大二叉树
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
- 二叉树的根是数组中的最大元素。
- 左子树是通过数组中最大值左边部分构造出的最大二叉树。
- 右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构建最大二叉树,并且输出这个树的根节点。
示例 :
输入:[3,2,1,6,0,5]
输出:返回下面这棵树的根节点:
6 / \ 3 5 \ / 2 0 \ 1
解答
递归来解决该问题,每次递归中,首先找到该区间内的最大值,然后建立一个结点,结点的值即为该最大值;结点的左孩子是最大值左侧区间的最大值,右孩子是最大值右侧区间的最大值。
细节:区间边界的处理。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* construct( vector<int>& nums, int begin, int end){
//基准
if( begin >= end)
return NULL;
//寻找当前区间的最大值
int pos = begin;
for( int i = begin + 1; i < end; i++)
if( nums[i] > nums[pos])
pos = i;
//此时,pos存储了当前区间的最大值的下标
//构建结点
TreeNode* now = new TreeNode( nums[pos]);
now->left = construct( nums, begin, pos);
now->right = construct( nums, pos + 1, end);
return now;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return construct( nums, 0, nums.size());
}
};