一开始很难理解,反复的画图和倾读博客,才是对其有了理解,真是开心!
不懂的话可以看看这几篇博客,写的很棒!
转:
http://blog.csdn.net/lulipeng_cpp/article/details/7816527
http://blog.csdn.net/int64ago/article/details/7429868
http://blog.csdn.net/yhf_2015/article/details/53844284
自己写了一个简单得树状数组代码,用于:求前缀和,更新结点
#include<bits/stdc++.h> using namespace std; const int maxn = 1005; int n,pos; int a[maxn]; int c[maxn]; int Lowbit(int x) { return x&(-x); } //更新 void Update(int pos, int num) //pos为更新的位置,num是要变化的值 { while(pos <= n) { c[pos] += num;//改变当前的值 pos += Lowbit(pos);//更新父亲结点 } } //求和 int Getsum(int pos)//求位置pos的前缀和 { int sum = 0; while(pos > 0) { sum += c[pos]; //求和累加 pos -= Lowbit(pos);//向前减少 } return sum; } int main() { while(~scanf("%d",&n)) { memset(c,0,sizeof(c)); for(int i = 1; i <= n; i++) { scanf("%d",&a[i]); Update(i,a[i]); } printf("输入所求的前缀和位置pos:"); scanf("%d",&pos); printf("pos的前缀和为:%d\n",Getsum(pos)); //更新 Update(5,2); printf("更新后pos为6的前缀和为:%d\n",Getsum(6)); } return 0; } /* 8 1 2 3 4 5 6 7 8 */