线段树是一棵二叉树,他的每个节点包含了两个额外的属性
start
和end
用于表示该节点所代表的区间。start和end都是整数,并按照如下的方式赋值:
- 根节点的 start 和 end 由
build
方法所给出。- 对于节点 A 的左儿子,有
start=A.left, end=(A.left + A.right) / 2
。- 对于节点 A 的右儿子,有
start=(A.left + A.right) / 2 + 1, end=A.right
。- 如果 start 等于 end, 那么该节点是叶子节点,不再有左右儿子。
实现一个
build
方法,接受 start 和 end 作为参数, 然后构造一个代表区间[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;
}
}