//线段树的节点
//节点包括两部分信息,基本域,和信息域
//基本域:左右边界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)级别的复杂度

 

posted on 2011-10-20 19:05  geeker  阅读(2227)  评论(0编辑  收藏  举报