就是递归地判断,函数里面一个是当前结点,另一个是父结点
然后你从当前结点,第一层开始遍历:
取出你拿到的结点
如果这个结点就是你的父结点的话就continue(防止输入的时候有问题)
如果这个结点的值小于你的父结点的话,那就代表不是一个小根堆
然后开始递归,把当前结点当作父结点,这个结点当作来弄的结点
如果不是的话返回false;
不然如果for循环结束还没有false的话,返回true
递归其实确实很妙,就是需要它的每一层的结构,都和上一层是完全一样的。
bool check_mi(int u, int fa)
{ //判断是否是小根堆
for (int i = 0; i < v[u].size(); i++)
{
int t = v[u][i];
if (t == fa)
continue;
if (a[t] < a[u])
return false;
if (!check_mi(t, u))
return false;
}
return true;
}