0001 #define Parent(i) ( ( ( i ) - 1 ) >> 1 ) //PQ[i]的父节点(floor((i-1)/2),i无论正负) 0002 #define LChild(i) ( 1 + ( ( i ) << 1 ) ) //PQ[i]的左孩子 0003 #define RChild(i) ( ( 1 + ( i ) ) << 1 ) //PQ[i]的右孩子 0004 #define InHeap(n, i) ( ( ( -1 ) != ( i ) ) && ( ( i ) < ( n ) ) ) //判断PQ[i]是否合法 0005 #define LChildValid(n, i) InHeap( n, LChild( i ) ) //判断PQ[i]是否有一个(左)孩子 0006 #define RChildValid(n, i) InHeap( n, RChild( i ) ) //判断PQ[i]是否有两个孩子 0007 #define Bigger(PQ, i, j) ( ( PQ[i] < PQ[j] ) ? j : i ) //取大者(等时前者优先) 0008 #define ProperParent(PQ, n, i) /*父子(至多)三者中的大者*/ \ 0009 ( RChildValid(n, i) ? Bigger( PQ, Bigger( PQ, i, LChild(i) ), RChild(i) ) : \ 0010 ( LChildValid(n, i) ? Bigger( PQ, i, LChild(i) ) : i \ 0011 ) \ 0012 ) //相等时父节点优先,如此可避免不必要的交换