zoukankan      html  css  js  c++  java
  • 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 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 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.
    
    Have you met this question in a real interview? Yes
    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]
    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
     1 /**
     2  * Definition of SegmentTreeNode:
     3  * public class SegmentTreeNode {
     4  *     public int start, end;
     5  *     public SegmentTreeNode left, right;
     6  *     public SegmentTreeNode(int start, int end) {
     7  *         this.start = start, this.end = end;
     8  *         this.left = this.right = null;
     9  *     }
    10  * }
    11  */
    12 public class Solution {
    13     /**
    14      *@param start, end: Denote an segment / interval
    15      *@return: The root of Segment Tree
    16      */
    17     public SegmentTreeNode build(int start, int end) {
    18         // write your code here
    19         if (start > end) return null;
    20         if (start == end) return new SegmentTreeNode(start, start);
    21         SegmentTreeNode cur = new SegmentTreeNode(start, end);
    22         cur.left = build(cur.start, (cur.start+cur.end)/2);
    23         cur.right = build((cur.start+cur.end)/2+1, cur.end);
    24         return cur;
    25     }
    26 }
  • 相关阅读:
    多态
    多继承
    传宗接代——继承
    解决vue项目更新版本后浏览器的缓存问题
    escape()、encodeURI()、encodeURIComponent()三种编码方式的区别
    epoll使用总结
    探讨c/c++的指针
    基于linux的pthread_t封装一个Thread类
    unix高并发编程中遇到的问题和笔记
    面向对象分析与设计 实验七
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5174343.html
Copyright © 2011-2022 走看看