Segment Tree Query

来源:互联网 发布:淘宝论坛手机版在哪里 编辑:程序博客网 时间:2024/05/16 11:58

For an integer array (index from 0 to n-1, where n is the size of this array), in the corresponding SegmentTree, each node stores an extra attribute max to denote the maximum number in the interval of the array (index from start to end).

Design a query method with three parameters rootstart and end, find the maximum number in the interval [start, end] by the given root of segment tree.

 Notice

It is much easier to understand this problem if you finished Segment Tree Build first.

Example

For array [1, 4, 2, 3], the corresponding Segment Tree is:

                  [0, 3, max=4]                 /             \          [0,1,max=4]        [2,3,max=3]          /         \        /         \   [0,0,max=1] [1,1,max=4] [2,2,max=2], [3,3,max=3]

query(root, 1, 1), return 4

query(root, 1, 2), return 4

query(root, 2, 3), return 3

query(root, 0, 2), return 4


改了半天发现就是一般的二分题,没有什么特别的。

要查询的内容分以下几类:

1. 不符合条件的 比如 start 》 end 那么需要处理下

2. start end 是作为segment tree某一个节点的start end

3. start end 正好垮了两个不同的节点的情况。


对于2,用root.start == start && root.end == end判断。

对于3,需要对当前节点的左右两个子节点求其中的最大值。拿上面的例子讲,如果要查询0,2.那么0 2 这个节点是不存在这棵树里的。需要找到当前节点的mid值,然后分别求左边跟右边: (0, 1)(2, 2)。 分别会带到左孩子(root.left)跟右孩子(root.right )得到的结果取一个最大值。


代码:

public int query(SegmentTreeNode root, int start, int end) {        // write your code here        if(root == null || start > end) return 0;                if(root.start == start && root.end == end){            return root.max;        }                int mid = (root.start + root.end)/2;        if(mid<start){            return query(root.right, start, end);        }        if(mid>end){            return query(root.left, start, end);        }        int leftmax = query(root.left, start, root.left.end);        int rightmax = query(root.right, root.right.start, end);        return Math.max(leftmax, rightmax);    }



0 0