看堆排序的時候看到堆這個結構,對這個結論有點好奇。
於是算了一下,其實結果還挺簡單的。
假設一個節點,他在數組下標是i
在二叉樹的第n層
且該節點在該層位於第x+1個(既在該層前方有x個節點)。
那么由於完全二叉樹前n層的總節點數是2^n - 1,在第n層的節點,前n-1層有2^(n-1) - 1個節點,加上他本層前面的x個節點,則:
i = 2^(n-1) - 1 + x
下面考慮子節點,i的子節點在第n+1層。
對於左子節點,令他在數組中下標為j。
左子節點在n+1層中,前面應該有2x個節點,(因為i在第n層前面有x個,每一個節點在下一層都會有2個節點)。
所以可以得到
j = (2^n - 1) + 2x = 2(2^(n-1) + x -1) + 1
= 2i + 1
這樣左節點下標j = 2i+1,右節點也就是2i+2了
補充:
其實想一下結果也很簡單,參考前面的計算,節點的下標就是節點前面的所有節點數。
節點數分為
- 前n-1層的節點數
- 本層前方的節點數。
對於子節點來說。
- 第一部分是前n層的節點數,恰好是父節點前n-1層節點數*2 + 1
- 第二部分子節點同層節點數,肯定是父節點同層前方節點數*2,因為是完全二叉樹。