[LintCode]Segment Tree Build 构造线段树
来源:互联网 发布:spss手机版软件 编辑:程序博客网 时间:2024/06/05 08:19
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.
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 *///BFS public SegmentTreeNode build(int start, int end) { if(start > end) return null; SegmentTreeNode root = new SegmentTreeNode(start, end); Queue<SegmentTreeNode> queue = new LinkedList<SegmentTreeNode>(); if(start < end) { queue.add(root); } while(!queue.isEmpty()) { SegmentTreeNode node = queue.poll(); int start1 = node.start; int end1 = (node.start + node.end)/2; int start2 = end1 + 1; int end2 = node.end; node.left = new SegmentTreeNode(start1, end1); node.right = new SegmentTreeNode(start2, end2); if(start1 != end1) { queue.add(node.left); } if(start2 != end2) { queue.add(node.right); } } return root; }}
- [LintCode]Segment Tree Build 构造线段树
- lintcode segment-tree-build 线段树的构造
- [LintCode]Segment Tree Query 线段树的查询
- Lintcode - Segment Tree Build
- [Lintcode]Segment Tree Build
- *[Lintcode]Segment Tree Build II
- 201.Segment Tree Build-线段树的构造(中等题)
- lintcode segment-tree-query 线段树的查询
- lintcode segment-tree-modify 线段树的修改
- 线段树(segment tree)
- 线段树(segment tree)
- 线段树(segment tree)
- 线段树(segment tree)
- 线段树(segment tree)
- 线段树(segment tree)
- segment tree(线段树)
- 线段树(segment tree)
- 线段树(segment tree) code
- Linux文件系统十问,你知道吗?
- JVM垃圾回收及调优总结
- Intent中的四个重要属性——Action、Data、Category、Extras
- APK 的安装与卸载
- linux 内核编译 (如何正确选择内核驱动)
- [LintCode]Segment Tree Build 构造线段树
- assign,retain,copy,weak,strong,readonly,nonatomic ,atomic 8个属性的特征
- javascript把数字格式化转换成货币型
- HDU 1358
- 数据库(第一范式,第二范式,第三范式)
- Windows 万能守护进程
- MySQL联合查询语法内联、左联、右联、全联
- java web项目中调用ocx遇到的问题!(无法调用)
- AVL实现平衡二叉树