堆排序(完全二叉樹)最后一個非葉子節點的序號是n/2-1的原因


堆排序是基於完全二叉樹實現的,在將一個數組調整成一個堆的時候,關鍵之一的是確定最后一個非葉子節點的序號,這個序號為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

轉載請注明來處


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM