线段树学习

今天学习了线段树。。

代码是敲了不少

可是感觉还没有真正理解

先不贴题目。。

再消化消化。。


一会儿还有计组实验。。还有那个傲娇的老师。。。真是烦。。


饿。。

先去吃饭去。。。一天木有吃。。。。。。

以下转自:http://www.cnblogs.com/liushang0419/archive/2011/10/20/2219325.html

?
//线段树的节点
//节点包括两部分信息,基本域,和信息域
//基本域:左右边界ld,rd.  左右孩子:lc,rc
//信息域:key值,如RMQ问题中,信息域中存储的是区间最大值
struct  Node{
     int  ld,rd;
     Node *lc,*rc;
     int  key;
};
 
//空树的建立,内含key值的初始化;
//一般在主函数中首先调用 Node* root= buildtree(1,n);建立一棵新树
Node *buildtree( int  a, int  b){
     Node * p= new  Node; //给P申请一块内存
     p->ld=a;
     p->rd=b;
     //{初始化 p->key }
     if (a==b) return  p; //叶子节点
     p->lc=buildtree(a,(a+b)/2);
     p->rc=buildtree((a+b)/2+1,b);
     return  p;
}
 
void  insert(Node *T, int  a, int  b, int  key){
     if (a<=T->ld&&b>=T->rd){
         //{根据key处理T->key; 然后 return ;}
     }
     if (a<=(T->ld+T->rd)/2)
         insert(T->lc,a,b,key);
     if (b>(T->ld+T->rd)/2)
         insert(T->rc,a,b,key);
     //{根据T->lc和T->rc的信息处理T->key}  (此处类似于归并排序中最后的合并操作)
}
 
int  search(Node *T, int  a, int  b){
     int  res;
     if (a<=T->ld&&b>=T->rd)
         // {根据T->key处理res;return res;}
     if (a<=(T->ld+T->rd)/2)
         //{根据search(T->lc,a,b)处理res}
     if (b>(T->ld+T->rd)/2)
         //根据search(T->rc,a,b)处理res}
     return  res;
}

什么是线段树:

线段树是一种用树状结构来存储一个连续区间的信息的数据结构

线段树的作用:

它主要用于处理一段连续区间的插入,查找,统计,查询等操作

复杂度:

设区间的长度是n,所有的操作的复杂度是logN级别的

线段树的性质:

1.线段树是平衡二叉树,最大深度为logN(N为线段树所标示的区间的长度)

2任意的线段树[a,b]在线段树的查询或查找过程中把这个线段最多分成log(b-a)份

以上两条性质保证了线段树除了建树外的操作都是Log(N)级别的复杂度


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值