码迷,mamicode.com
首页 > 其他好文 > 详细

lintcode-medium-Segment Tree Build II

时间:2016-04-05 19:13:58      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

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 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)


/**
 * 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 class Solution {
    /**
     *@param A: a list of integer
     *@return: The root of Segment Tree
     */
    public SegmentTreeNode build(int[] A) {
        // write your code here
        
        if(A == null || A.length == 0)  
            return null;
        
        return build(A, 0, A.length - 1);
    }
    
    public SegmentTreeNode build(int[] A, int start, int end){
        if(start == end){
            return new SegmentTreeNode(start, end, A[start]);
        }
        
        int mid = start + (end - start) / 2;
        
        SegmentTreeNode left = build(A, start, mid);
        SegmentTreeNode right = build(A, mid + 1, end);
        
        SegmentTreeNode root = new SegmentTreeNode(start, end, Math.max(left.max, right.max));
        root.left = left;
        root.right = right;
        
        return root;
    }
    
}

 

lintcode-medium-Segment Tree Build II

标签:

原文地址:http://www.cnblogs.com/goblinengineer/p/5356093.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!