lintocde-247-线段树的查询 II

247-线段树的查询 II

对于一个数组,我们可以对其建立一棵 线段树, 每个结点存储一个额外的值 count 来代表这个结点所指代的数组区间内的元素个数. (数组中并不一定每个位置上都有元素)
实现一个 query 的方法,该方法接受三个参数 root, start 和 end, 分别代表线段树的根节点和需要查询的区间,找到数组中在区间[start, end]内的元素个数。

注意事项

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

样例

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

query(1, 1), return 0
query(1, 2), return 1
query(2, 3), return 2
query(0, 2), return 2

标签

二叉树 LintCode 版权所有 线段树

思路

lintcode-202-线段树的查询 类似,只需注意边界条件

code

/**
 * 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: The root of segment tree.
     * @param start: start value.
     * @param end: end value.
     * @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 > end) {
            return 0;
        }
        int mid = (root->start + root->end) / 2;
        if (start <= root->start && end >= root->end) {
            return root->count;
        }
        else if (mid < start) {
            return query(root->right, start, end);
        }
        else if (mid + 1 > end) {
            return query(root->left, start, end);
        }
        else {
            return query(root->left, start, mid) + query(root->right, mid + 1, end);
        }
    }
};
原文地址:https://www.cnblogs.com/libaoquan/p/7307787.html