當一棵二叉樹的每個結點都大於等於它的兩個子結點時,它被稱爲堆有序。
二叉堆是一組能夠用堆有序的完全二叉樹排序的元素,並在數組中按照層級儲存(不使用數組的第一個位置)。
命題 \(O\):根結點是堆有序的二叉樹中的最大結點。
由堆有序的定義可知,層數爲 2 的堆有序二叉樹滿足命題。
假設存在層數等於 m 的堆有序二叉樹使得命題成立,那麼,對於層數爲 m+1 的堆有序二叉樹:
該二叉樹由兩顆層數爲 m 的堆有序二叉樹及一個根節點組成,因爲層數等於 m 的堆有序二叉樹滿足命題,故兩棵子二叉樹的根結點爲子樹中的最大結點,同時由堆有序的定義知這兩棵子二叉樹的根節點小於等於總樹的根節點,故有層數爲 m+1 的堆有序二叉樹滿足命題。
由數學歸納法,對於任意堆有序的二叉樹,命題 O 總成立。
命題 \(P\):在一個二叉堆中,位置(數組索引)\(k\) 處的結點的父結點的位置爲 \([k/2]\),而它的兩個子結點的位置則分別爲 \(2k\) 和 \(2k+1\)。
用以下結構分別表示二叉堆數組中任意的父節點(結點 \(A\))、子結點(左子結點 \(B\) 和右子結點 \(C\)):
/
〇 A
/ \
〇 B 〇 C
/ \ / \
設結點 \(A\) 所在深度爲 \(k\)(根結點所在深度 \(k_0=0\)),所在列爲 \(j\)(每層的最左側結點的列號 \(j_0=0\))、\(S_p(k)\) 爲深度爲 \(k\) 的完美二叉樹的結點總數。
則 \(A\) 結點在二叉堆數組中的索引 \(I(A)=S_p(k-1)+j+1=2^k-1+j+1=2^k+j\)[1],\(B\) 的索引 \(I(B)=S_p(k)+2j+1=2^{k+1}+2j\)[2],\(C\) 的索引 \(I(C)=S_p(k)+2j+2=2^{k+1}+2j+1\)。
\(I(B)=2I(A)\),\(I(C)=2I(A)+1\),\(I(A)=[I(B)/2]=[I(C)/2]\)。命題成立。