线段树基础
来源:互联网 发布:iapp制作文字游戏源码 编辑:程序博客网 时间:2024/06/05 19:54
平衡二叉树是完全二叉树,算法复杂度为O(logn)级别,建树用二分法找到左右两个子节点,直到不能继续划分节点,线段树主要用于处理一段连续区间的插入、查找、统计、查询等操作,线段树的运行时间主要是
1、对于任意两个节点的区间,要么完全包含,要么互不相交
2、任意线段[a,b]在线段树的查询或查找过程中把线段最多分成log(b-a)份
线段树模板
void Build(int node,int left,int right){ //建树
//当前节点,左端点,右端点
对叶子结点的操作;
int mid =(left +right)/2;
Build(node*2,left,mid);//建立左子树
Build(noode*2+1,mid+1,right);//建立右子树
维护区间属性的操作;}
Update(int node ,int left ,int right ,intpoint ,int value) { //单点更新
//当前节点,左端点,右端点,查询节点,操作更改的数
if(left==right) {//找到要操作的节点,对其进行操作; return ;}
int mid=(left+right)/2;
if(point<=mid)Update(node*2,left,mid,point,value);
elseUpdate(node*2+1,mid+1,right,point,value);
维护区间属性的操作;
}
Update(int node ,int left ,int right ,int L,int R ,int value) { //区间更新
//当前节点,左端点,右端点,查询区间左端点,查询区间右端点,操作更改的数
if(left>=L&&right<=R) {//找到要操作的区间,对其进行操作; return ;}
int mid=(left+right)/2;
if(left<=mid) Update(node*2+1,left,mid,point,value);
if(right>mid) Update(node*2,mid+1,right,point,value);
维护区间属性的操作;
}
Query(int node ,int left ,int right ,int L,int R) { //单点查询
if(left>=L&&right<=R) return 状态值;
int mid=(left+right)/2;
int temp1=0,temp2=0;
if(left<=mid) temp1=Query(node*2 ,left,mid ,L ,R);
if(right>mid temp2=Query(node*2+1 ,mid,right ,L ,R);
return 要求的状态值;(如max(temp1,temp2);)
}
从通过对点的操作到对区间的操作,点的操作是通过不断的向下找点(找到点的标志是左右端点值相同),区间的操作是寻找每一个包含于需要操作的的子区间
- 线段树基础
- 基础线段树
- 线段树基础题
- 线段树 基础
- 线段树基础篇
- POJ2528线段树基础
- 线段树基础
- 线段树基础 poj2104
- 线段树基础 poj2352
- 线段树基础
- 算法基础 - 线段树
- 线段树-基础
- HDU1556 - 线段树基础
- 线段树基础总结
- 线段树基础入门
- 线段树基础
- 线段树(基础)
- 线段树基础
- 构建乘积数组
- Anaconda环境配置
- 小记-面试时对MVC的理解
- vue简介
- python3.6基础学习记录(二)
- 线段树基础
- 小白入门,获取Json串
- Binary Tree
- python_lintcode_480二叉树的所有路径_376二叉树的路径和
- iOS网络-AFNetworking详解
- 【C语言·字符串】常用字符串函数介绍
- SQL中的case when then else end用法
- over 函数 和 leteral view
- 代码设置textsize(不用diptopx,pxtodip啦)