线段树基础

来源:互联网 发布: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);)

}

 

从通过对点的操作到对区间的操作,点的操作是通过不断的向下找点(找到点的标志是左右端点值相同),区间的操作是寻找每一个包含于需要操作的的子区间

原创粉丝点击