线段树是一棵二叉树,他的每个节点包含了两个额外的属性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: * class SegmentTreeNode { * public: * int start, end; * SegmentTreeNode *left, *right; * SegmentTreeNode(int start, int end) { * this->start = start, this->end = end; * this->left = this->right = NULL; * } * } */ class Solution { public: /** *@param start, end: Denote an segment / interval *@return: The root of Segment Tree */ /* 思路:建立线段树,也是遵循树的特性,采用递归的方法建树; 首先明确基准情形,然后,利用线段树的性质,递归建树! */ SegmentTreeNode * build(int start, int end) { // write your code here if(start>end){ return NULL; } SegmentTreeNode* pHead=new SegmentTreeNode(start,end); if (start==end){ return pHead; } int mid=start+(end-start)/2; pHead->left=build(start,mid); pHead->right=build(mid+1,end); return pHead; } };