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;

    }

results matching ""

    No results matching ""