对于一个有n个数的整数数组,在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性
max
,值为该节点所代表的数组区间start到end内的最大值。
为SegmentTree设计一个
query
的方法,接受3个参数root
,start
和end
,线段树root所代表的数组中子区间[start, end]内的最大值。
注意事项
在做此题之前,请先完成 线段树构造 这道题目。
样例
对于数组
[1, 4, 2, 3]
, 对应的线段树为:
[0, 3, max=4]
/ \
[0,1,max=4] [2,3,max=3]
/ \ / \
[0,0,max=1] [1,1,max=4] [2,2,max=2], [3,3,max=3]
query(root, 1, 1), return
4
query(root, 1, 2), return4
query(root, 2, 3), return3
query(root, 0, 2), return4
代码
/**
* Definition of SegmentTreeNode:
* public class SegmentTreeNode {
* public int start, end, max;
* public SegmentTreeNode left, right;
* public SegmentTreeNode(int start, int end, int max) {
* this.start = start;
* this.end = end;
* this.max = max
* this.left = this.right = null;
* }
* }
*/
public int query(TreeNode root, int start, int end) {
// 如果查询区间在当前节点的区间之内,直接输出结果
// 这么写的好处在于在递归时查询区间不需要改变
if (start <= root.start && root.end <= end) {
return root.max;
}
int mid = root.start + (root.end - root.start) / 2;
// 给结果赋初值
int ans = Integer.MIN_VALUE;
// 如果查询区间和左边节点区间有交集,则寻找查询区间在左边区间上的最大值
if (mid >= start) {
ans = Math.max(ans, query(root.left, start, end));
}
// 如果查询区间和右边节点区间有交集,则寻找查询区间在右边区间上的最大值
if (mid + 1 <= end) {
ans = Math.max(ans, query(root.right, start, end));
}
return ans;
}