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