题目地址:
https://www.lintcode.com/problem/maximum-binary-tree/description
给定一个数组,要求按照下列规则进行建一个”最大树“:
1、root是数组中的最大数字;
2、左子树由最大数字左边的数构成,并且左子树也是个最大树;
3、右子树由最大数字右边的数构成,并且右子树也是个最大树;
定义是递归的,所以直接递归建树即可。代码如下:
public class Solution {
/**
* @param nums: an array
* @return: the maximum tree
*/
public TreeNode constructMaximumBinaryTree(int[] nums) {
// Write your code here
if (nums == null || nums.length == 0) {
return null;
}
return dfs(nums, 0, nums.length - 1);
}
private TreeNode dfs(int[] nums, int left, int right) {
if (left > right) {
return null;
}
// 找出最大值和其坐标
int max = Integer.MIN_VALUE, maxIdx = 0;
for (int i = left; i <= right; i++) {
if (max < nums[i]) {
max = nums[i];
maxIdx = i;
}
}
// 建树根,递归建立左子树和右子树
TreeNode root = new TreeNode(max);
root.left = dfs(nums, left, maxIdx - 1);
root.right = dfs(nums, maxIdx + 1, right);
return root;
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n log n ) O(n\log n) O(nlogn),空间 O ( h ) O(h) O(h)。