线段树简介

线段树是一棵二叉搜索树,与普通的二叉搜索树最大的差别是每个节点都表示的是一个线段,有一个起点和终点。

建立线段树的时间复杂度是O(n),查询和删除的复杂度都是O(logN)。

定义节点来表示一个线段

typedef struct node{
       int start;//线段开始
       int end;//线段结束
       int mid;//线段中值,标准的线段树是没有这个值的,我加入这个值方便运算
       int count;//线段被覆盖的次数
       struct node* left;//左子树
       struct node* right;//右子树
}node;

简要写一下插入操作的实现:

void insert(int start, int end, node* cur){
          if(start==cur->start&&end==cur->end){//如果恰好覆盖到该节点
             ++cur->count;
              return ;
           }
          else if(start>=cur->start&&end<=cur->mid)//如果在当前节点的左侧
            insert(start,cur->mid,cur->left);
          else if(start>=cur->mid&&end<=cur->end)//如果在当前节点的右侧
            insert(cur->mid+1;end,cur->right);
          else{//如果跨越了当前节点
             insert(start,cur->mid,cur->left);
             insert(cur->mid+1,end,cur->right);
          }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值