题目要求
给定一个没有重复的整数数组。 此阵列上的最大树构建定义如下:
1、根是数组中的最大数字。
2、左子树是根的左部分子数组构造的最大树。
3、右子树是根的右部分子数组构造的最大树。
4、通过给定数组构造最大树并输出此树的根节点。
输入实例
Example 1:
Input: [3,2,1,6,0,5]
Output: return the tree root node representing the following tree:
====== 注意返回树而不是数组 ======
6
/ \
3 5
\ /
2 0
\
1
Note:
The size of the given array will be in the range [1,1000].
解题思路
根据最大二叉树的定义,我们要保证根节点是最大的,且他的左右子树也是最大(构建方法和根是一致的)。因此根据这样的逻辑关系,我们想到每次只要找到数组中的最大值并且用递归来对左右子树(数组)操作,那么最后返回的即为最大二叉树。
这里面有两个难点,一是如何找到数组中的最大数字?二是如何根据最大数字进行左右子数组的划分以及表示?
在本题中,我们通过使用 max_element()函数来找数组中的最大值索引。
并且通过最大值作为划分位点,来把数组分成两部分。左数组:left_nums(nums.begin(), index) 右数组:right_nums(next(index), nums.end()); 其中next表示index的下一位。
主要代码c++
/**
* 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* constructMaximumBinaryTree(vector<int>& nums) {
if(nums.empty()) return nullptr;
auto index = max_element(nums.begin(),nums.end()); // 寻找数组中的最大值,返回索引。
vector <int> left_nums(nums.begin(), index); //根据最大数划分 左子数组
vector <int> right_nums(next(index), nums.end());//根据最大数划分 右子数组
//返回的是树形结构,所以来构建树!!
TreeNode * root = new TreeNode(*index);
root->left = constructMaximumBinaryTree(left_nums); // 递归构建树的左孩子
root->right = constructMaximumBinaryTree(right_nums); // 递归构建树的右孩子
return root;
}
};
主要代码python
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def constructMaximumBinaryTree(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
"""
if not nums:
return 0
max_index = nums.index(max(nums))
root = TreeNode(nums[max_index])
root.left = self.constructMaximumBinaryTree(nums[:max_index])
root.right = self.constructMaximumBinaryTree(nums[max_index+1:]) # 注意max_index已经拿出了
return root
相似题目:
解答:leetcode 226. Invert Binary Tree(倒置一个二叉树,递归,非递归)