为什么没有使用堆数组的元素零?

Ern*_*est 11 java heap

这是我对具有任意值的堆的开头的粗略草图

 0   1    2    3    4    5    6    7    8    9   ...
[-] [10] [14] [15] [22] [21] [24] [23] [44] [30] ...
Run Code Online (Sandbox Code Playgroud)

为什么array [0]中的元素必须始终设置为null?
或者为什么我们不应该使用它?

NPE*_*NPE 18

有几种方法可以将二进制堆表示为数组.

有一种方法可以使用元素零; 还有一种方法,即使用元素零:

  1. root是元素0; 元素的子元素n是元素2n+12n+2;
  2. root是元素1; 元素的子元素n是元素2n2n+1.

两者都不比另一个更"正确".前者更适合使用基于零的数组的编程语言,而后者更适合使用基于单一数组的语言.

您似乎遇到了使用第二种方法的实现.由于所讨论的语言Java使用从零开始的数组,因此元素零存在但未被使用.

  • 我想指出,使用基于一的索引,可以通过位移有效地实现"PARENT = [n/2]"和"LEFTCHILD = 2n"操作. (4认同)