判断彻底二叉树是否是一个堆

彻底二叉树适合用数组存储,并且从第二个位置及a[1]开始存储,这样对于一个节点i,它的左子树和右子树就分别为i*2i*2+1
对于一个彻底二叉树存储的树结构,能够用以下方法来它是否是一个堆。
方法1:c++

bool isMinHeap(int root){
    if(root*2>n) return true;//叶节点 
    if(root*2<=n&&root*2+1<=n&&cb[root]<=cb[root*2]&&cb[root]<=cb[root*2+1]){//有左右子树 
        return isMinHeap(root*2)&&isMinHeap(root*2+1);
    }else if(root*2==n&&cb[root]<=cb[root*2]){//仅有左子树 //考试时判断的是root*2<=n,致使一个测试点错误,如输入的3个节点为2 3 1 
        return true;                            //因此必定要认真分析,这一步就是判断只有左子树的状况。 
    }else{
        return false;
    }
}
bool isMaxHeap(int root){
    if(root*2>n) return true;
    if(root*2<=n&&root*2+1<=n&&cb[root]>=cb[root*2]&&cb[root]>=cb[root*2+1]){
        return isMaxHeap(root*2)&&isMaxHeap(root*2+1);
    }else if(root*2==n&&cb[root]>=cb[root*2]){
        return true;
    }else{
        return false;
    }
}

调用时直接直接将树根1传入就好了。数组

上面是考试时想到的方法,有点麻烦,下面是别人更简洁的方法。测试

方法二:code

bool isMaxH=true,isMinH=true;
for(int i=2;i<=n;i++){
    if(cb[i/2]<cb[i]){
        isMaxH=false;
    }
    if(cb[i/2]>cb[i]){
        isMinH=false;
    }
} 
if(isMinH){
    cout<<"Min Heap"<<endl;
}else if(isMaxH){
    cout<<"Max Heap"<<endl;
}else{
    cout<<"Not Heap"<<endl;
}

题目:1155 Heap Paths(30 分)
1147 Heaps (30 分)get

相关文章
相关标签/搜索