最大最小堆的判定
堆类型的判定
就是判定堆是最大堆,最小堆还是不是堆。看到很多算法都是自上而下的,看起来不是特别简洁,有一点乱。
在这里记录一下我自己写的自下而上的堆判定函数。
const int notHeap = 0, maxHeap = 1, minHeap = -1;
int cmp(int parent,int child)
{
if (parent > child) return maxHeap;
else return minHeap;
}
int isWhatHeap()
{
int flag = cmp(Btree[(Btree.size() - 1) / 2], Btree[Btree.size() - 1]);
for (int i = Btree.size() - 1; i > 1; i--)
if (flag != cmp(Btree[i / 2], Btree[i]))
return notHeap;
return flag;
}
思路很简单,简单介绍一下:
-
取堆的最后一个孩子和父亲的大小关系作为堆的类型。
-
从最后一个孩子开始,历遍到根节点后一个。
-
获取每一个孩子与父节点的大小关系。
-
如果其中一对结点与堆类型不相同,说明不是堆,返回notHeap。
-
否则返回一开始确定的堆类型
个人认为看起来相对简洁一些,不用分开判断左孩子右孩子。
不过其实差别不大留一道复习用的例题~