摘要:唯一需要注意的就是的赋值取左右子树的的较大值,最后一层的独立结点的为对应数组中的值。
Segment Tree Build I Problem
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.
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
public class Solution {
public SegmentTreeNode build(int start, int end) {
// write your code here
if (start > end) {
return null;
}
SegmentTreeNode root = new SegmentTreeNode(start, end);
if (start == end) {
return root;
}
root.left = build(start, (start+end)/2);
root.right = build((start+end)/2+1, end);
return root;
}
}
Segment Tree Build II
Difference
Definition of SegmentTreeNode:
public class SegmentTreeNode {
public int start, end, max;
public SegmentTreeNode left, right;
public SegmentTreeNode(int start, int end, int max) {
this.start = start;
this.end = end;
this.max = max
this.left = this.right = null;
}
}
Example
Given [3,2,1,4]. The segment tree will be:
[0, 3] (max = 4)
/
[0, 1] (max = 3) [2, 3] (max = 4)
/ /
[0, 0](max = 3) [1, 1](max = 2)[2, 2](max = 1) [3, 3] (max = 4)
Note
唯一需要注意的就是max的赋值:取左右子树的max的较大值,最后一层的独立结点的max为对应数组中的值。
Solutionpublic class Solution {
public SegmentTreeNode build(int[] A) {
// write your code here
return build(A, 0, A.length - 1);
}
public SegmentTreeNode build(int[] A, int start, int end) {
if (start > end) {
return null;
}
SegmentTreeNode root = new SegmentTreeNode(start, end, Integer.MIN_VALUE);
if (start != end) {
int mid = (start + end) / 2;
root.left = build(A, start, mid);
root.right = build(A, mid+1, end);
root.max = Math.max(root.left.max, root.right.max);
}
else root.max = A[end];
return root;
}
}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/65477.html
摘要:题目是要查询到这个区间内某一点的。值是从最底层的子节点值里取最大值。因此,不用太复杂,递归就可以了。与所不同的是,对所给区间内的元素个数求和,而非筛选。这样就会出现的情况,视作本身处理。 Segment Tree Query Problem For an integer array (index from 0 to n-1, where n is the size of this ar...
摘要:和其它题目一样,依然是递归的做法。注意若树的结点范围为,那么至少有个数在左子树上,所以语句里用了号。另外,最后一句是调用递归之后的结果,必须写在最后面。 Problem For a Maximum Segment Tree, which each node has an extra value max to store the maximum value in this nodes i...
摘要:这道题目是筛选出数组中的最小值,存入新数组。因此,联想到和系列的题目,对于的处理,使用线段树是非常有效的方法。之前我们创建的线段树,有和两个。参照这个参数,可以考虑在这道题增加一个的参数,代表每个结点的最小值。 Problem Given an integer array (index from 0 to n-1, where n is the size of this array),...
摘要:示例解题代码注意,如果要在上提交解答,必须把接口和类的代码一并提交,这里并没有在写类中 我理解的数据结构(八)—— 线段树(SegmentTree) 一、什么是线段树 1.最经典的线段树问题:区间染色有一面墙,长度为n,每次选择一段墙进行染色,m次操作后,我们可以看见多少种颜色?m次操作后,我们可以在[i, j]区间内看见多少种颜色?showImg(https://segmentfau...
阅读 2527·2021-10-08 10:04
阅读 1422·2021-09-03 10:40
阅读 1304·2019-08-30 15:53
阅读 3436·2019-08-30 13:13
阅读 3144·2019-08-30 12:55
阅读 2460·2019-08-29 13:21
阅读 1688·2019-08-26 12:12
阅读 2982·2019-08-26 10:37