Segment Tree Build II

225 篇文章 0 订阅

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.

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)

一开始觉的跟第一题不大一样,因为多了一个max元素,仔细一想其实是一样的。在构建这个树的过程中,需要先构建一个节点的子节点,所以子节点的max值是可以找到的,然后当前节点的最大值就由左右孩子的max值决定就好了。


代码:

public SegmentTreeNode build(int[] A) {
        // write your code here
        if(A == null || A.length == 0) return null;
        return build(A, 0, A.length-1);
    }
    
    private SegmentTreeNode build(int [] A, int low, int high){
        if(low > high) return null;
        if(low == high){
             SegmentTreeNode node = new SegmentTreeNode(low, high);
             node.max = A[low];
             return node;
        } 
        
        int mid = (low + high)/2;
        
        SegmentTreeNode left = build(A, low, mid);
        SegmentTreeNode right = build(A, mid+1, high);
        
        SegmentTreeNode node = new SegmentTreeNode(low, high);
        node.left = left;
        node.right = right;
        node.max = Math.max(left.max, right.max);
        return node;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值