A1110
题目链接
个人思路
- 找根节点:输入数据,标记数据中的子节点,其中未被标记(不是其他节点的子节点),说明是根节点
- 完全二叉树的判断依据:层序遍历该二叉树,
1、若当前节点的左孩子为空,右孩子不为空,则非完全二叉树;
2、若发现某个节点没有右孩子则进行标记,在这之后入队的节点如果不是叶子节点那么就不是完全二叉树。
出错点
- 数据输入问题:数据范围是0~20,因此存在两位数,不能用单个字符接收数据,要用字符数组接收10 ~ 20之间的两位数数据
- 判断条件问题:当节点的右孩子为空,说明之后的所有节点应为叶子节点(可能包含当前节点),但是不能把判断条件改为左孩子不空,右孩子空,此判断条件过于特殊,无法AC
个人思路错误代码
#include <bits/stdc++.h>
using namespace std;
int hashtable[25];
bool inq[25];
int N, root;
struct Node{
int data;
int left, right;
Node(){}
Node(int d, int l, int r)
{
data = d;
left = l;
right = r;
}
}nodes[105];
int bfs(int cnt)
{
bool isleaf = false;
queue<Node> q;
q.push(nodes[root]);
inq[root] = true;
while(!q.empty())
{
Node now = q.front();
q.pop();
cnt++;
if(isleaf == true)
{
if(now.left != -1 || now.right != -1)
return -1;
}
if(now.left == -1 && now.right != -1)
return -1;
else if(now.left != -1 && now.right == -1)
{
isleaf = true;
}
if(cnt == N)
return now.data;
if(now.left != -1 && inq[now.left] == false)
{
q.push(nodes[now.left]);
inq[now.left] = true;
}
if(now.right != -1 && inq[now.right] == false)
{
q.push(nodes[now.right]);
inq[now.right] = true;
}
}
}
int main(int argc, char *argv[]) {
scanf("%d", &N);
for(int i = 0; i < N; ++i)
{
char l, r;
int ll, rr;
getchar();
scanf("%c %c", &l, &r);
if(l == '-')
ll = -1;
else
ll = l - '0';
if(r == '-')
rr = -1;
else
rr = r - '0';
nodes[i] = Node(i, ll, rr);
hashtable[ll] = hashtable[rr] = 1;
}
for(int i = 0; i < N; ++i)
{
if(hashtable[i] == 0)
{
root = i;
break;
}
}
int flag = bfs(0);
if(flag == -1)
{
printf("NO %d", root);
}
else
{
printf("YES %d", flag);
}
return 0;
}
AC代码
#include <bits/stdc++.h>
using namespace std;
int hashtable[25];
bool inq[25];
int N, root;
struct Node{
int data;
int left, right;
Node(){}
Node(int d, int l, int r)
{
data = d;
left = l;
right = r;
}
}nodes[105];
int bfs(int cnt)
{
bool isleaf = false;
queue<Node> q;
q.push(nodes[root]);
inq[root] = true;
while(!q.empty())
{
Node now = q.front();
q.pop();
cnt++;
if(isleaf == true)
{
if(now.left != -1 || now.right != -1)
return -1;
}
if(now.left == -1 && now.right != -1)
return -1;
if(now.right == -1)
{
isleaf = true;
}
if(cnt == N)
return now.data;
if(now.left != -1)
{
q.push(nodes[now.left]);
inq[now.left] = true;
}
if(now.right != -1)
{
q.push(nodes[now.right]);
inq[now.right] = true;
}
}
}
int main(int argc, char *argv[]) {
scanf("%d", &N);
for(int i = 0; i < N; ++i)
{
char l[3], r[3];
int ll, rr;
scanf("%s %s", l, r);
if(l[0] == '-')
ll = -1;
else
sscanf(l, "%d", &ll);
if(r[0] == '-')
rr = -1;
else
sscanf(r, "%d", &rr);
nodes[i] = Node(i, ll, rr);
hashtable[ll] = hashtable[rr] = 1;
}
for(int i = 0; i < N; ++i)
{
if(hashtable[i] == 0)
{
root = i;
break;
}
}
int flag = bfs(0);
if(flag == -1)
{
printf("NO %d", root);
}
else
{
printf("YES %d", flag);
}
return 0;
}