问题描述:https://www.nowcoder.com/practice/976164f3464145c486cbc855f1a60aae?sourceQid=23276&sourceTpId=265(怀疑是智商问题,读题读了好几遍才懂)
言归正传:根据示例:
6
2 1
3 2
4 3
5 2
6 1
我们可以画出如下的二叉树:
对于上述的输入关系,可以用vector存储表示为:
由题目,根节点1是唯一多人逃生出口,意在寻找节点1的最大子树节点个数;
此时从上往下计算的话,我们可以想到队列queue先进先出的特性,从1往下走,可以到2和6,而2又可以到1,5,3, 一步步往下计算最大个数,将已经计算过的节点标记为true,避免后续重复计数。
q.push(tmp1[i]); //从1往下的第一个数
int cnt = 0; //记录经过的节点
while(!q.empty())
{
int p = q.front();
cnt++;
vis[p] = true; //将计算过的节点数设置为true
for(int j = 0; j < tmp[p].size(); j++)
{
if(!vis[tmp[p][j]])
q.push(tmp[p][j]); //从上往下走时,当有未计算的数,将其压入栈中
}
q.pop(); //将记录过的节点出栈
}
r = max(r, cnt); //记录节点最大数