Lintcode: Segment Tree Build
2016-02-01 06:41
501 查看
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
/** * 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, end: Denote an segment / interval *@return: The root of Segment Tree */ public SegmentTreeNode build(int start, int end) { // write your code here if (start > end) return null; if (start == end) return new SegmentTreeNode(start, start); SegmentTreeNode cur = new SegmentTreeNode(start, end); cur.left = build(cur.start, (cur.start+cur.end)/2); cur.right = build((cur.start+cur.end)/2+1, cur.end); return cur; } }
相关文章推荐
- Divide and conquer:Sumsets(POJ 2549)
- UISlider用法总结
- iOS开发篇——UITextField
- iOS UIProgressView控件用法
- PAT1101. Quick Sort
- 微博UI
- HOWTO build additional kernel modules for Android
- 理解 Android Build 系统
- How To Build CyanogenMod Android for smartphone
- batman-adv——B.A.T.M.A.N. Advanced quick start guide
- (OK) 完整编译android 4.4源码—问题—CSSValueKeywords.cpp—CSSPropertyNames.cpp
- (NOT OK) How To Build CyanogenMod Android for Motorola Defy ("jordan")
- (OK) 交叉编译hello.c for android (--sysroot),不使用Android.mk和ndk-build
- error: undefined reference to '__aeabi_uidiv'
- ProcessMaker 3 Workflow & BPM Documentation——Enterprise Trial Guide
- Storm中new Value 与input.getString(int i)
- LinkedBlockingQueue 与ConcurrentLinkedQueue
- 阻塞队列BlockingQueue
- getRequestDispatcher()与sendRedirect()的区别
- primary key与unique的区别