The structure of Segment Tree is a binary tree which each node has two attributes start
and end
denote an segment / interval.node
start and end are both integers, they should be assigned in following rules:ui
build
method.start=A.left, end=(A.left + A.right) / 2
.start=(A.left + A.right) / 2 + 1, end=A.right
.Implement a build
method with two parameters startand 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.this
Segment Tree (a.k.a Interval Tree) is an advanced data structure which can support queries like:spa
See wiki:
Segment Tree
Interval Treecode
Given start=0, end=3
. The segment tree will be:blog
[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]
這道題讓咱們創建線段樹,也叫區間樹,是一種高級樹結構,可是題目中講的很清楚,因此這道題實現起來並不難,咱們能夠用遞歸來創建,寫法很簡單,參見代碼以下:ip
class Solution { public: /** *@param start, end: Denote an segment / interval *@return: The root of Segment Tree */ SegmentTreeNode * build(int start, int end) { if (start > end) return NULL; SegmentTreeNode *node = new SegmentTreeNode(start, end); if (start < end) { node->left = build(start, (start + end) / 2); node->right = build((start + end) / 2 + 1, end); } return node; } };