徹底二叉樹適合用數組存儲,並且從第二個位置及a[1]開始存儲,這樣對於一個節點i
,它的左子樹和右子樹就分別爲i*2
和i*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; }