题目描述:
思路:在查询过程中,可能会遇到三种情况,目标区间在本区间中点的左边; 在本区间中点的右边; 跨越本区间的中点。
在左边的情况:从当前节点移动到左孩子节点。
在右边的情况:从当前节点移动到右孩子节点。
在中间的情况:从中间分开,两边都要考虑,取其大者。
递归进行。
代码:
int query(SegmentTreeNode * root, int start, int end) {
// write your code here
if(start == root->start && end == root->end){
return root->max;
}
int mid = root->start + (root->end - root->start)/2;
if(start > mid){
return query(root->right, start, end);
}
else if(end <= mid){
return query(root->left, start, end);
}
else{
int l = query(root->left, start, mid);
int r = query(root->right, mid+1, end);
return l>=r? l: r;
}
}