http://www.lintcode.com/en/problem/segment-tree-query-ii/

注意点:先考虑 给定区间和root区间的位置关系,然后将一些显而易见的结果返回;

    如果给定区间>root区间,将给定区间缩小至root区间大小。

    如果给定区间<=root区间, 那分别查询给定区间在root左右子树区间的结果。

    最后所有的结果统计总是通过叶节点的区间结果累计起来的。[0,0]],[1,1]...

 

 1  public int query(SegmentTreeNode root, int start, int end) {
 2      if(root == null) return 0;
 3      int left = root.start, right = root.end;
 4      if(start > end || start > right || end < left) return 0;
 5      
 6      if((start == left && end == right)) return root.count;
 7      if(left > start) start = left;
 8      if(right < end) end = right;
 9      if(left < right) {
10          int count1 = query(root.left, start, end);
11          int count2 = query(root.right, start, end);
12          return count1 + count2;
13      }
14      return root.count;  //left == right
15      
16  }
17  //九章
18  public int query(SegmentTreeNode root, int start, int end) {
19         // write your code here
20         if(start > end || root==null)
21             return 0;
22         if(start <= root.start && root.end <= end) { // 相等 
23             return root.count;
24         }
25         
26         int mid = (root.start + root.end)/2;
27         int leftsum = 0, rightsum = 0;
28         if(start > root.end || end < root.start) return 0;
29         // 左子区
30         if(start <= mid) {
31             if( mid < end) { // 分裂 
32                 leftsum =  query(root.left, start, mid);
33             } else { // 包含 
34                 leftsum = query(root.left, start, end);
35             }
36         }
37         // 右子区
38         if(mid < end) { // 分裂 3
39             if(start <= mid) {
40                 rightsum = query(root.right, mid+1, end);
41             } else { //  包含 
42                 rightsum = query(root.right, start, end);
43             } 
44         }  
45         // else 就是不相交,mid不在start-end的区间范围内,说明,start-end仅在左子区或者右子区
46         return leftsum + rightsum;
47  }
View Code