美文网首页线段树
202. 线段树的查询

202. 线段树的查询

作者: 6默默Welsh | 来源:发表于2018-01-28 20:03 被阅读19次

描述

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

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

注意事项

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

样例

对于数组 [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]

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

代码

/**
 * Definition of SegmentTreeNode:
 * public class SegmentTreeNode {
 *     public int start, end, max;
 *     public SegmentTreeNode left, right;
 *     public SegmentTreeNode(int start, int end, int max) {
 *         this.start = start;
 *         this.end = end;
 *         this.max = max
 *         this.left = this.right = null;
 *     }
 * }
 */
public int query(TreeNode root, int start, int end) {
    // 如果查询区间在当前节点的区间之内,直接输出结果
    // 这么写的好处在于在递归时查询区间不需要改变
    if (start <= root.start && root.end <= end) {
        return root.max;
    }

    int mid = root.start + (root.end - root.start) / 2;
    // 给结果赋初值
    int ans = Integer.MIN_VALUE; 
    // 如果查询区间和左边节点区间有交集,则寻找查询区间在左边区间上的最大值
    if (mid >= start) {   
        ans = Math.max(ans, query(root.left, start, end));
    }
    // 如果查询区间和右边节点区间有交集,则寻找查询区间在右边区间上的最大值
    if (mid + 1 <= end) {
        ans = Math.max(ans, query(root.right, start, end));
    }
    return ans; 
}

相关文章

  • 202. 线段树的查询

    描述 对于一个有n个数的整数数组,在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性m...

  • 线段树

    一、线段树建树、单点修改、区间查询 二、线段树建树、区间修改、区间查询

  • 数据结构-线段树

    实现一个线段树 下面实现的线段树,有三个功能: 把数组构建成一颗线段树 线段树的修改 线段树的查询 303号问题 ...

  • Java 算法-线段树的修改

      首先说明一下,看这个博客之前,最好有线段树的基本概念,比如说线段树的构造、线段树的查询之类的。最近在学习ANd...

  • 线段树 03 在线段树中查询

    查询区间 [queryL, queryR] 上被赋予的意义 将问题转化为一个递归问题:在以treeIndex为根的...

  • 主席树(静态) 图文讲解让你一次就懂 hdu2665为例

    主席树 先介绍一下主席树,主席树也称函数式线段树也称可持久化线段树。(其实就是支持查询历史版本,这个在看完之后就会...

  • 各类线段树模板

    1.用数组维护线段树,可实现单点修改和区间查询。

  • XMUM 2017 越南国家赛 第A题 Another Quer

    理论:线段树+区段更新+lazy思想 思路:看到题目中说要更新数组中一个区段的数,还有查询求和就可以往线段树的思路...

  • 学习时间性价比最高的数据结构--线段树

    如果时间太紧张,紧张到只能学一种数据结构,那么它一定是线段树。线段树支持区间修改,区间查询,能完全替代单调队列、树...

  • 247. 线段树查询 II

    描述 对于一个数组,我们可以对其建立一棵 线段树, 每个结点存储一个额外的值 count 来代表这个结点所指代的数...

网友评论

    本文标题:202. 线段树的查询

    本文链接:https://www.haomeiwen.com/subject/gkdzaxtx.html