http://www.lintcode.com/en/problem/segment-tree-query-ii/\#
这题思路和query i 颇为相似,需要考虑些corner case.
如果start 和 end 任一超出了界线,则可把界线用root的界线替代。
跨左右子树的情况下,递归分治
最后结果相加
public int query(SegmentTreeNode root, int start, int end) {
// write your code here
if (root == null) {
return 0;
}
if (start > root.end || end < root.start || start > end) {
return 0;
}
if (start < root.start) {
start = root.start;
}
if (end > root.end) {
end = root.end;
}
if (start == root.start && end == root.end) {
return root.count;
}
int mid = (root.start + root.end) / 2;
if (start > mid) {
return query(root.right, start, end);
}
if (end <= mid) {
return query(root.left, start, end);
}
int left = query(root.left, start, mid);
int right = query(root.right, mid + 1, end);
return left + right;
}