堆排序是基於完全二叉樹實現的,在將一個數組調整成一個堆的時候,關鍵之一的是確定最后一個非葉子節點的序號,這個序號為n/2-1,n為數組的長度。但是為什么呢?
可以分兩種情形考慮:
①堆的最后一個非葉子節點若只有左孩子
②堆的最后一個非葉子節點有左右兩個孩子
完全二叉樹的性質之一是:如果節點序號為i,在它的左孩子序號為2*i+1,右孩子序號為2*i+2。
對於①左孩子的序號為n-1,則n-1=2*i-1,推出i=n/2-1;
對於②左孩子的序號為n-2,在n-2=2*i-1,推出i=(n-1)/2-1;右孩子的序號為n-1,則n-1=2*i+2,推出i=(n-1)/2-1;
很顯然,當完全二叉樹最后一個節點是其父節點的左孩子時,樹的節點數為偶數;當完全二叉樹最后一個節點是其父節點的右孩子時,樹的節點數為奇數。
根據java語法的特征,整數除不盡時向下取整,則若n為奇數時(n-1)/2-1=n/2-1。
因此對於②最后一個非葉子節點的序號也是n/2-1。
得證。
顯然序號是從0開始的。
為了得到而努力
2019-03-16
轉載請注明來處