202 · 线段树的查询

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

为SegmentTree设计一个 query 的方法,接受3个参数root, start和end,根据给定的线段树根,找出区间[start,end]中的最大值。

在做此题之前,请先完成 线段树构造 这道题目。
样例

样例 1:

输入:"[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]",1,2
输出:4
解释:
对于数组 [1, 4, 2, 3], 对应的线段树为 :

                      [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]
[1,2]区间最大值为4

样例 2:

输入:"[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]",2,3
输出:3
解释:
对于数组 [1, 4, 2, 3], 对应的线段树为 :

                      [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]
[2,3]区间最大值为3

/**

 * Definition of SegmentTreeNode:

 * 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

        int max = 0;

        if(nullptr == root)

        {

            return 0;

        }

        std::queue<SegmentTreeNode *>sque;

        sque.push(root);

        while(false == sque.empty())

        {

            SegmentTreeNode * node = sque.front();

            if(nullptr == node)

            {

                break;

            }

            sque.pop();

            if(node->start == node->end)

            {

                if(node->start>=start && node->start<=end)

                {

                    if(max < node->max)

                    {

                        max = node->max;

                    }

                }   

            }

            SegmentTreeNode * left = node->left;

            SegmentTreeNode * right = node->right;

            if(nullptr != left)

            {

                sque.push(left);

            }

           if(nullptr != right)

           {

                sque.push(right);

           }

           

        }

        return max;

    }

};

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值