线段树解析以及代码模板
来源:互联网 发布:京东淘宝网手机 编辑:程序博客网 时间:2024/06/06 23:19
线段树的概念
线段树是一种二叉搜索树,线段树的每个节点存了一个区间,所以得名。线段树如果是非叶子节点一定有两个子节点,如果有左子树那么就一定有右子树。
主要应用是区间最大值以及区间最小值以及区间求和,区间更新。
线段树的数据域
一般存储区间的和,以及区间的最大值,最小值等等。
线段树的操作
以区间求值为例子struct Node{int begin,end;Node *left;Node *right; int sum;Node(int a,int b,int s):begin(a),end(b),sum(s){}}//构造树Node * buildTree(vector<int>&nums,int begin ,int end ){Node *root=NULL;if(begin==end){root=new Node(begin,end,nums[begin]);return root;}Node* l=buildTree(nums,begin,begin+(end-begin)/2);Node* r=buildTree(nums,begin+(end-begin)/2+1,end);root=new Node(begin,end,l->sum+r->sum);root->left=l;root->right=r;return root;}//查询树int queryTree(int i,int j,Node * root){if(root==NULL)return 0;if(root->begin<=i&&root->end<=j)return root->sum;int mid=root->begin+(root->end-root->begin)/2;int lsum=0;int rsum=0;if(i<=mid)lsum=query(i,j,root->left);if(j>mid)rsum=query(i,j,root->right);return lsum+rsum;}int updateTree(int i,int val,Node * root){int diff=0;if(root->begin==i&&root->end==i){diff=val-root->sum;root->sum=val;}int mid=root->begin+(root->end-root->begin)/2;if(i<=mid)diff=updateTree(i,val,root->left);if(i>mid)diff=updateTree(i,val,root->right);root->sum+=diff;return diff;}
阅读全文
0 0
- 线段树解析以及代码模板
- 线段树的代码模板
- 线段树和RMQ解析和模板
- 线段树模板以及对线段树的理解
- 线段树知识点理解及其模板代码
- 线段树的代码模板(补充中)
- ※ Leetcode - Segment Tree - 307. Range Sum Query - Mutable (线段树+树状数组两种解法以及模板的常见问题解析)
- ACM 线段树模板(模板)
- 线段树模板
- hdu_1166_线段树模板
- 线段树模板
- 线段树模板 poj2777
- 线段树模板
- 线段树模板
- 线段树-模板
- 线段树模板
- 线段树模板
- 线段树模板
- 八枚硬币(c\python略)
- 强转字符串类型+截取字符串
- java基础---一些常用类
- tf.gfile.FastGFile造成的'utf-8' codec can't decode..错误
- Unity3d热门基础之常用API之Input使用详解
- 线段树解析以及代码模板
- hdu Bone Collector II
- Android编程权威指南第三版挑战练习二
- Eclipse+Maven创建webapp项目
- ImageLoader的使用
- 关于ARGB_8888、ALPHA_8、ARGB_4444、RGB_565的理解
- 习题6.3作业更正提交2017.11.08
- ListView的优化
- [LeetCode-Algorithms-55] "Jump Game" (2017.11.7-WEEK10)