判断是否是最小堆

算法思想:
判断以某节点为根的树是否为最小堆。
检查左右(存在的话)儿子值是否小于根,如果小于,返回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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值