// 线段树.cpp :定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
using namespace std;
typedef struct node
{
int i,j;//区间
intcover;
struct node*lchild,*rchild;
}ITree;
ITree *createTree(int a,int b)
{
ITree*r;
if(b <a)return NULL;//区间无效
r = newITree;
r->i =a;
r->j =b;
r->cover =0;
if(b - a >1)//如果区间大于1
{
r->lchild = createTree(a,(a + b) / 2);//递归创建左子树
r->rchild = createTree((a + b) / 2,b);//递归创建右子树
}
else//如果区间大于1
{
r->lchild = r->rchild = NULL;//叶子结点
}
returnr;
}
void InsTree(ITree *r,int a,int b)
{
intmid;
if(r->i<= a && r->j <= b)
{
r->cover++;
}
else
{
mid = (r->i + r->j) / 2;
if(mid <= a)
{
InsTree(r->rchild,a,b);//在右子树中插数据
}
else if( mid >= b)
{
InsTree(r->lchild,a,b);//在左子树中插数据
}
else//区间在mid的两边
{
InsTree(r->lchild,a,mid);
InsTree(r->lchild,mid,b);
}
}
}
//线段树的删除跟线段树的插入类似
void DeleteTree(ITree *r,int a,int b)
{
intmid;
if(r->i>= a && r->j <= b)
{
r->cover--;
}
else
{
mid = (r->i + r->j) / 2;
if(mid <= a)
{
DeleteTree(r->rchild,a,b);//在右子树中删除数据
}
else if( mid >= b)
{
DeleteTree(r->lchild,a,b);//在左子树中删除数据
}
else//区间在mid的两边
{
DeleteTree(r->lchild,a,mid);
DeleteTree(r->lchild,mid,b);
}
}
}
int count(ITree *r)
{
if(r->cover > 0)
{
return(r->j - r->i);
}
elseif(r->j - r->i == 1)//如果r->cover=0并且是叶子结点
{
return 0;
}
else//如果r->cover=0并且是分支结点
{
return(count(r->lchild) + count(r->rchild));
}
}
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"dd"<<endl;
ITree *r;
r =createTree(1,10);
InsTree(r,3,6);
InsTree(r,7,9);
cout<<"测度为:"<<count(r)<<endl;
return0;
}