#439 Segment Tree Build II

本文详细介绍了一种高级数据结构——区间树(又称段树)的构建方法。通过递归方式创建区间树,每个节点对应数组中特定区间的最大值。文章提供了具体实现案例,帮助读者理解区间树的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

The structure of Segment Tree is a binary tree which each node has two attributesstart and end denote an segment / interval.

start and end are both integers, they should be assigned in following rules:

  • The root's start and end is given by build method.
  • The left child of node A has start=A.left, end=(A.left + A.right) / 2.
  • The right child of node A has start=(A.left + A.right) / 2 + 1, end=A.right.
  • if start equals to end, there will be no children for this node.

Implement a build method with a given array, so that we can create a corresponding segment tree with every node value represent the corresponding interval max value in the array, return the root of this segment tree.

Clarification

Segment Tree (a.k.a Interval Tree) is an advanced data structure which can support queries like:

  • which of these intervals contain a given point
  • which of these points are in a given interval

See wiki:
Segment Tree
Interval Tree

Example

Given [3,2,1,4]. The segment tree will be:

                 [0,  3] (max = 4)
                  /            \
        [0,  1] (max = 3)     [2, 3]  (max = 4)
        /        \               /             \
[0, 0](max = 3)  [1, 1](max = 2)[2, 2](max = 1) [3, 3] (max = 4)
题目思路:

这题先从最下面的子树找起,start==end的时候,max就是A[start]。找完子树的max就可以得到root的max了。还是用recursion就行。

Mycode(AC = 86ms):

/**
 * 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 A: a list of integer
     *@return: The root of Segment Tree
     */
    SegmentTreeNode * build(vector<int>& A) {
        // write your code here
        return buildTree(A, 0, A.size() - 1);
    }
    
    SegmentTreeNode* buildTree(vector<int>& A, int start, int end) {
        if (start > end) {
            return NULL;
        }
        else if (start == end) {
            return new SegmentTreeNode(start, end, A[start]);
        }
        else {
            SegmentTreeNode *root = new SegmentTreeNode(start, end, A[start]);
            root->left = buildTree(A, start, (start + end) / 2);
            root->right = buildTree(A, (start + end) / 2 + 1, end);
            
            int max_val = INT_MIN;
            if (root->left) max_val = max(max_val, root->left->max);
            if (root->right) max_val = max(max_val, root->right->max);
            root->max = max_val;
            
            return root;
        }
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值