lintcode-medium-Segment Tree Build

Posted 哥布林工程师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lintcode-medium-Segment Tree Build相关的知识,希望对你有一定的参考价值。

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 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 start and 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]

/**
 * Definition of SegmentTreeNode:
 * public class SegmentTreeNode {
 *     public int start, end;
 *     public SegmentTreeNode left, right;
 *     public SegmentTreeNode(int start, int end) {
 *         this.start = start, this.end = end;
 *         this.left = this.right = null;
 *     }
 * }
 */
public class Solution {
    /**
     *@param start, end: Denote an segment / interval
     *@return: The root of Segment Tree
     */
    public SegmentTreeNode build(int start, int end) {
        // write your code here
        if(start > end)
            return null;
        if(start == end)
            return new SegmentTreeNode(start, end);
        
        SegmentTreeNode root = new SegmentTreeNode(start, end);
        SegmentTreeNode left = build(start, start + (end - start) / 2);
        SegmentTreeNode right = build(start + (end - start) / 2 + 1, end);
        
        root.left = left;
        root.right = right;
        
        return root;
    }
}

 

 

以上是关于lintcode-medium-Segment Tree Build的主要内容,如果未能解决你的问题,请参考以下文章

lintcode-medium-Segment Tree Modify

lintcode-medium-Segment Tree Query II

lintcode-medium-Segment Tree Build II

从样本中删除 \t\t\t\t\t

TopN案例

Lua table直接索引VS缓存索引性能测试小示例