判斷徹底二叉樹是否是一個堆

徹底二叉樹適合用數組存儲,並且從第二個位置及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

相關文章
相關標籤/搜索