线段树的查询-LintCode

来源:互联网 发布:网优雇佣军软件 编辑:程序博客网 时间:2024/06/08 04:36

对于一个有n个数的整数数组,在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性max,值为该节点所代表的数组区间start到end内的最大值。

为SegmentTree设计一个 query 的方法,接受3个参数root, start和end,线段树root所代表的数组中子区间[start, end]内的最大值。

注意事项:
在做此题之前,请先完成 线段树构造 这道题目。

样例:
对于数组 [1, 4, 2, 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

#ifndef C202_H#define C202_H#include<iostream>#include<vector>using namespace std;class SegmentTreeNode{public:    int start, end, max;    SegmentTreeNode *left, *right;    SegmentTreeNode(int start, int end, int max)    {        this->start = start;        this->end = end;        this->max = max;        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 maximum number in the interval [start, end]    */    int query(SegmentTreeNode * root, int start, int end) {        // write your code here        if (start > end||start<root->start||end>root->end)            return 0;        SegmentTreeNode *node = root;        if (start == node->start&&end == node->end)            return node->max;        if (end <= node->left->end)            return query(node->left, start, end);        else if (start >= node->right->start)            return query(node->right, start, end);        else        {            return maxVal(query(node->left, start, node->left->end), query(node->right, node->right->start, end));        }    }    int maxVal(int a, int b)    {        return a > b ? a : b;    }};#endif