201. 线段树的构造

描述

线段树是一棵二叉树,他的每个节点包含了两个额外的属性startend用于表示该节点所代表的区间。start和end都是整数,并按照如下的方式赋值:

  • 根节点的 startendbuild 方法所给出。
  • 对于节点 A 的左儿子,有 start=A.left, end=(A.left + A.right) / 2
  • 对于节点 A 的右儿子,有 start=(A.left + A.right) / 2 + 1, end=A.right
  • 如果 start 等于 end, 那么该节点是叶子节点,不再有左右儿子。

实现一个 build 方法,接受 startend 作为参数, 然后构造一个代表区间 [start, end]的线段树,返回这棵线段树的根。

说明

线段树(又称区间树), 是一种高级数据结构,他可以支持这样的一些操作:

  • 查找给定的点包含在了哪些区间内
  • 查找给定的区间包含了哪些点
    见百科:
    线段树
    区间树

样例

比如给定start=1, end=6,对应的线段树为:

               [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: start value.
     * @param end: end value.
     * @return: The root of Segment Tree.
     */
    public SegmentTreeNode build(int start, int end) {
        return buildHelper(start, end);
    }
    
    private SegmentTreeNode buildHelper(int start, int end) {
        // 区间异常
        if (start > end) {
            return null;
        }
        
        // 遇到叶子结点
        if (start == end) {
            return new SegmentTreeNode(start, end);
        }
        
        // 分治 + 递归
        int mid = start + (end - start) / 2;
        SegmentTreeNode root = new SegmentTreeNode(start, end);
        root.left = buildHelper(start, mid);
        root.right = buildHelper(mid + 1, end);
        
        return root;
    }
}

你可能感兴趣的:(201. 线段树的构造)