线段树的构造
2015-10-28 23:09
253 查看
线段树是一棵二叉树,他的每个节点包含了两个额外的属性
根节点的 start 和 end 由
对于节点 A 的左儿子,有
对于节点 A 的右儿子,有
如果 start 等于 end, 那么该节点是叶子节点,不再有左右儿子。
实现一个
样例
比如给定
说明
线段树(又称区间树), 是一种高级数据结构,他可以支持这样的一些操作:
查找给定的点包含在了哪些区间内
查找给定的区间包含了哪些点
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 if (start > end) { return NULL; } SegmentTreeNode *node = new SegmentTreeNode(start, end); if (start == end) { return node; } node->left = build(start, (start+end)/2); node->right = build((start+end)/2+1, end); return node; } };
相关文章推荐
- commons.logging 和 log4j
- vimrc
- yii2视频教程
- TOP 10 开源的推荐系统简介
- UiDevice的UiObject的讲解
- 一道题(1)
- 第一篇博客-初入Android解决Fetching Android SDK component information问题
- 小白笔记--------------------链栈
- 大三CS狗一点想法
- 怎样在spring初始化完成后执行一些操作?
- List集合拆分
- LightOJ - 1068 Investigation(数位DP)
- dropzone
- USB鼠标通信协议格式
- zoj3911 线段树区间修改与求素数的结合
- js xuexi
- 第七次作业——团队作业——项目冲刺———第一天
- 黑马程序员——Java 基础:匿名内部类
- java springmvc 微信公众平台自动回复乱码问题
- Ubuntu学习 - SVN服务搭建