Segment Tree Build II

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

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)

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

/**
 * 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 null;
        SegmentTreeNode root=new SegmentTreeNode(start,end,Integer.MAX_VALUE);

        if(start==end)
        {
            root.max=A[start];
            return root;
        }

        root.left=build(A,start,(start+end)/2);
        root.right=build(A,((start+end)/2)+1,end);
        int maxLeft=0;
        int maxRight=0;
        if(root.left!=null)
        {
            maxLeft=root.left.max;
        }
        else
        {
            maxLeft=Integer.MAX_VALUE;
        }

        if(root.right!=null)
        {
            maxRight=root.right.max;
        }
        else
        {
            maxRight=Integer.MAX_VALUE;
        }

        root.max=Math.max(maxLeft,maxRight);

        return root;
    }
}
时间: 2024-12-11 08:23:46

Segment Tree Build II的相关文章

[LintCode] Segment Tree Build II 建立线段树之二

The structure of Segment Tree is a binary tree which each node has two attributes startand 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 bybuild method

Segment Tree Build I & II

Segment Tree Build I 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 i

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 meth

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

lintcode-medium-Segment Tree Build II

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 metho

Segment Tree Query I & II

Segment Tree Query I For an integer array (index from 0 to n-1, where n is the size of this array), in the corresponding SegmentTree, each node stores an extra attribute max to denote the maximum number in the interval of the array (index from start

Lintcode: Segment Tree Modify

For a Maximum Segment Tree, which each node has an extra value max to store the maximum value in this node's interval. Implement a modify function with three parameter root, index and value to change the node's value with [start, end] = [index, index

Lintcode203 Segment Tree Modify solution 题解

[题目描述] For a Maximum Segment Tree, which each node has an extra value max to store the maximum value in this node's interval. Implement a modify function with three parameter root,index and value to change the node's value with[start, end] = [index,

线段树+离散化 IP地址段检查 SEGMENT TREE

Problem: Give a series of IP segments, for example, [0.0.0.1-0.0.0.3], [123.234.232.21-123.245.21.1]... Now there is a new IP, find which IP segment it's in ? Solution: First, we could map the ends of IP segments into some intervals, since the IP add