zoukankan      html  css  js  c++  java
  • [LintCode] Segment Tree Build 建立线段树

    The structure of Segment Tree is a binary tree which each node has two attributes start 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 hasstart=A.left, end=(A.left + A.right) / 2.
    • The right child of node A hasstart=(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 two parameters startand end, so that we can create a corresponding segment tree with every node has the correct start and end value, 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 start=0, end=3. The segment tree will be:

                   [0,  3]
                 /        
          [0,  1]           [2, 3]
          /                /     
       [0, 0]  [1, 1]     [2, 2]  [3, 3]
    

    Given start=1, end=6. The segment tree will be:

                   [1,  6]
                 /        
          [1,  3]           [4,  6]
          /                /     
       [1, 2]  [3,3]     [4, 5]   [6,6]
       /               /     
    [1,1]   [2,2]     [4,4]   [5,5]

    这道题让我们建立线段树,也叫区间树,是一种高级树结构,但是题目中讲的很清楚,所以这道题实现起来并不难,我们可以用递归来建立,写法很简单,参见代码如下:

    class Solution {
    public:
        /**
         *@param start, end: Denote an segment / interval
         *@return: The root of Segment Tree
         */
        SegmentTreeNode * build(int start, int end) {
            if (start > end) return NULL;
            SegmentTreeNode *node = new SegmentTreeNode(start, end);
            if (start < end) {
                node->left = build(start, (start + end) / 2);
                node->right = build((start + end) / 2 + 1, end);
            }
            return node;
        }
    };
  • 相关阅读:
    【2020-05-03】发掘自己内心那个原点的力量
    【2020-05-02】要适应不确定性
    【2020-05-01】人生十三信条
    【一句日历】2020年5月
    【2020-04-30】每一句话,都是自我学习
    【2020-04-29】勤奋是一种享受
    【2020-04-28】自我观念强化的实践
    【2020-04-27】自我提升的里程碑
    【2020-04-26】还在温室里的自己
    家谱树(信息学奥赛一本通 1351)
  • 原文地址:https://www.cnblogs.com/grandyang/p/5659314.html
Copyright © 2011-2022 走看看