线段树学习

来源:互联网 发布:二叉树前中后遍历算法 编辑:程序博客网 时间:2024/05/29 08:40

今天学习了线段树。。

代码是敲了不少

可是感觉还没有真正理解

先不贴题目。。

再消化消化。。


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


饿。。

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

以下转自: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)级别的复杂度


原创粉丝点击