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 }