您的位置:首页 > 其它

线段树查询 II

2015-10-29 00:57 344 查看
对于一个数组,我们可以对其建立一棵
线段树
, 每个结点存储一个额外的值
count
来代表这个结点所指代的数组区间内的元素个数. (数组中并不一定每个位置上都有元素)

实现一个
query
的方法,该方法接受三个参数
root
,
start
end
, 分别代表线段树的根节点和需要查询的区间,找到数组中在区间[start, end]内的元素个数。

样例

对于数组
[0, 空,2, 3]
, 对应的线段树为:

[0, 3, count=3]
/             \
[0,1,count=1]             [2,3,count=2]
/         \               /            \
[0,0,count=1] [1,1,count=0] [2,2,count=1], [3,3,count=1]

query(1, 1)
, return
0


query(1, 2)
, return
1


query(2, 3)
, return
2


query(0, 2)
, return
2


/**
* Definition of SegmentTreeNode:
* class SegmentTreeNode {
* public:
*     int start, end, count;
*     SegmentTreeNode *left, *right;
*     SegmentTreeNode(int start, int end, int count) {
*         this->start = start;
*         this->end = end;
*         this->count = count;
*         this->left = this->right = NULL;
*     }
* }
*/
class Solution {
public:
/**
*@param root, start, end: The root of segment tree and
*                         an segment / interval
*@return: The count number in the interval [start, end]
*/
int query(SegmentTreeNode *root, int start, int end) {
// write your code here
if (root == NULL || start > root->end)
{
return 0;
}
if (start == root->start && end == root->end)
{
return root->count;
}
else if (start >= root->left->start && start <= root->left->end)
{
if (end <= root->left->end)
{
return query(root->left, start, end);
}
else
{
return query(root->left, start, root->left->end)
+ query(root->right, root->right->start,
min(end, root->right->end));
}
}
else
{
return query(root->right, start, min(end, root->right->end));
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: