算法思想:
判断以某节点为根的树是否为最小堆。
检查左右(存在的话)儿子值是否小于根,如果小于,返回false。
检查以左儿子为根的子树是否是最小堆,如果不是返回false。
检查以右儿子(存在的话)为根的子树是否是最小堆,如果不是返回false。
代码实现:
bool IsMinHeap(int A[],int k,int len) {
/* 检验以k为根节点的树是否是最小堆 */
if (k*2<=len) { /* 只检验非终端节点,以终端节点(叶子节点)为根的堆一定是最小堆 */
if (A[k]>A[2*k]) return false;
if (k*2<len && A[k]>A[2*k+1]) return false; /* 右儿子如果存在的话,判断之 */
if (!IsMinHeap(A,2*k,len)) return false; /* 如果左子树不是最小堆,返回false */
if (k*2<len && !IsMinHeap(A,2*k+1,len)) return false; /* 右子树..*/
}
return true;
}
复杂度:
每个节点都最多比较2次。访问了每个非终端节点。复杂度为O(n)。