先看一幅图
树状数组英文名叫 Binary Indexed Tree或Fenwick Tree。这也就表明 树状数组逻辑上是一种树,但是物理上是用数组来存储。
1、存储树状数组的数组下标是从1开始的。
2、如何得到一个结点的祖先结点?
观察到:
从低向上地
- 结点1(0001)【1的二进制形式是0001】的祖先节点分别是2(0010)、4(0100),8(1000)
- 结点2(0010)的祖先结点为4(0100),8(1000)
- 结点3(0011)的祖先节点为4(0100),8(1000)
- 结点5(0101)的祖先节点为6(0110),8(1000)
…
于是我们可以归纳出:
编号为n的父结点的编号为(n + n’)。
n’如何得到的呢?
将n写成二进制,将此二进制中的除了最后1之外所有的1改为0,改完得到的就是n’的二进制表示,所以就得到了n’。
3、如何得到一个结点的左边的兄弟结点?
观察到,自右向左:
- 3(0011)左边的兄弟分别为1(0010)
- 5(0101)左边的兄弟分别为4(0100)
- 7(0111)左边的兄弟分别为6(0110)、4(0100)
…
于是我们可以归纳出:
编号为n的结点右边挨着的兄弟节点的编号为n-n’。
n’如何得到呢?其实和2中的n’是一样的。