计数函数
程序:
int lowbit(int k)
{
return k&-k;
}
功能:可视为每个节点的编号函数
加和函数
程序:
int sum(int x)
{
int ret=0;
while(x>0)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
功能:在二叉搜索树上求节点i的前缀和
添加函数
程序:
void addBIT(int x,int d)
{
while(x<=n)
{
c[x]+=d;
x+=lowbit(x);
}
}
功能:在二叉搜索树上某个节点x上添加一个数d,用于计算添加了d之后对C数组的影响
备注:
x-=lowbit(x);或者x+=lowbit(x);都可以看做函数的方向函数,因为都在指示方向。
对于整个二叉搜索树,编号为0永远没有意义,因此,就算是数组,也应该从1开始标号
另附程序:
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=20;
int c[maxn];
int n;
int lowbit(int k)
{
return k&-k;
}
int sum(int x)
{
int ret=0;
while(x>0)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
void addBIT(int x,int d)
{
while(x<=n)
{
c[x]+=d;
x+=lowbit(x);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
addBIT(i,i);
for(int i=1;i<=n;i++)
printf("%2d\n",c[i]);
int key=sum(3);
printf("%d\n",key);
return 0;
}