最大二叉树(Maximum Binary Tree)问题是构造一个最大二叉树,它的左子树和右子树也是最大二叉树,并且每个节点的值都大于左子树和右子树的值。
我们可以使用分治法实现最大二叉树算法:
public TreeNode constructMaximumBinaryTree(int[] nums) {
return construct(nums, 0, nums.length);
}
private TreeNode construct(int[] nums, int left, int right) {
if (left == right) return null;
int maxIndex = maxIndex(nums, left, right);
TreeNode root = new TreeNode(nums[maxIndex]);
root.left = construct(nums, left, maxIndex);
root.right = construct(nums, maxIndex + 1, right);
return root;
}
private int maxIndex(int[] nums, int left, int right) {
int maxVal = Integer.MIN_VALUE;
int maxIndex = left;
for (int i = left; i < right; i++) {
if (nums[i] > maxVal) {
maxIndex = i;
maxVal = nums[i];
}
}
return maxIndex;
}
算法流程:
- 递归构建最大二叉树。对于区间 [left, right],找到最大值的索引 maxIndex。
- 构造根节点,值为nums[maxIndex]。
- 递归构建左子树,区间为[left, maxIndex]。
- 递归构建右子树,区间为[maxIndex + 1, right]。
- 返回根节点,得到最大二叉树。
- 当left == right时,说明区间为空,返回null。
- maxIndex()方法找到[left, right]区间最大值的索引。
时间复杂度O(nlogn),空间复杂度O(n)。
所以,最大二叉树的关键是:
- 使用分治法递归构建最大二叉树。
- 在每个区间找到最大值的索引maxIndex。
- 根据maxIndex构建根节点,递归构建左右子树。
- 终止条件为left == right,返回null。
- maxIndex()辅助方法找到最大值索引。