[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.node

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

  • 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.this

Clarification

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

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

See wiki:
Segment Tree
Interval Treecode

Example

Given start=0, end=3. The segment tree will be:blog

[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]

 

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

 

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;
    }
};
相关文章
相关标签/搜索