![在这里插入图片描述](https://img-blog.csdnimg.cn/3c239d9be83840eeb8f4ae7b234b7762.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASURvV2hhdElEb185Mjc2MQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
先上错误答案
![在这里插入图片描述](https://img-blog.csdnimg.cn/a952384ce5264cf1bf6090c601930018.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASURvV2hhdElEb185Mjc2MQ==,size_19,color_FFFFFF,t_70,g_se,x_16)
错误原因:
输入的时候可能是先输入子节点的节点情况再输入父节点的节点情况。 如果给出: 3 2 01 1 02 02 1 03 可以正确输出。 但是如果换成这样给出: 3 2 02 1 03 01 1 02 输入的树和上面的一样,但是此时是2先输入,答案就会出错。
错误代码:
#include
#include
#include
using namespace std;
const int maxn = 100;
struct NODE {
int level;//标记当前节点在第几层
vector child;
};
bool visited[maxn] = { false };
int N, M;
NODE n[maxn];
queue q;
int leaves[maxn] = { 0 };
int hie = 0;
void LayerOrder() {
vector::iterator it;
for (it = n[0].child.begin(); it != n[0].child.end(); ++it) {
q.push(*it);
}
int tmp;
while (!q.empty()) {
tmp = q.front();
q.pop();
if (n[tmp].child.size() == 0) {
++leaves[n[tmp].level];
}
for (it = n[tmp].child.begin(); it!= n[tmp].child.end(); ++it) {
q.push(*it);
}
}
}
int main()
{
cin >> N >> M;
if (N == 0) {
cout //输入的时候,想当然的以为父节点会先输入,将没有访问过的节点都当作父节点处理,并赋值level为1.
n[tmproot].level = 1;
n[0].child.push_back(tmproot);
}
cin >> numofchild;
for (int j = 0; j
cout
queue q;
q.push(root);
int last = root;//用last做层次上的标记,每次都标记每一层的最后一个节点
int tmp;
int leaf=0;
while (!q.empty()) {
tmp = q.front();
if (Tree[tmp].size() == 0) ++leaf;
else for (int i = 0; i
cin >> N >> M;
if (N == 0) {
cout
cin >> tmpchild;
Tree[tmproot].push_back(tmpchild);
}
}
LayerOrder(1);
for (int i=0 ; i |