链接:https://www.lintcode.com/zh-cn/problem/segment-tree-query/
对于一个有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), return 4
query(root, 2, 3), return 3
query(root, 0, 2), return 4
/**
* Definition of SegmentTreeNode:
* class SegmentTreeNode {
* public:
* int start, end, max;
* SegmentTreeNode *left, *right;
* SegmentTreeNode(int start, int end, int max) {
* this->start = start;
* this->end = end;
* this->max = max;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: The root of segment tree.
* @param start: start value.
* @param end: end value.
* @return: The maximum number in the interval [start, end]
*/
int query(SegmentTreeNode * root, int start, int end) {
// write your code here
int mid = root->start + (root->end-root->start) / 2;
if (start <= root->start && end >= root->end)
{
return root->max;
}
else if (mid < start)
{
return query(root->right, start, end);
}
else if (mid + 1 > end)
{
return query(root->left, start, end);
}
else
{
return max(query(root->left, start, mid), query(root->right, mid + 1, end));
}
}
};