您的位置:首页 > 其它

完全二叉树的判断(PAT甲级 1110)

2018-03-20 21:23 351 查看
题目链接 https://www.patest.cn/contests/pat-a-practise/1110

【题意】

给定一颗二叉树,判断其是否为一颗完全二叉树

【输入格式】

单组输入,第一行给出一个正整数N(N<=20),它是树中节点的总数,节点的编号从0到N-1。 然后跟着N行,每行对应一个节点,并给出节点的左侧和右侧子节点的编号。 如果子结点不存在,则用“-”代替。

【输出格式】

如果树是完全二叉树,则打印“YES”,并且打印树上最后一个节点的编号,如果不是,则打印“NO”和根结点的标号,中间用空格隔开。

【思路】

数据结构基础题,用一个结构体数组记录一颗二叉树的数据结构,结构体中有par,lson,rson分别代表当前结点的父亲结点,左结点和右结点,均初始化为-1表示不存在。有了这样一个数组后,我们可以从根结点开始进行bfs,当bfs队列的队头元素为-1时跳出循环,根据完全二叉树的性质,如果这时已经访问完所有的树结点,那么这棵树就是一颗完全二叉树,否则一定不是一颗完全二叉树。

#include<bits/stdc++.h>
using namespace std;

const int maxn = 25;

int n, root, last;
struct node {
int par, lson, rson;
}tree[maxn];

bool bfs() {
for (int i = 0; i<n; ++i) {
if (tree[i].par == -1) {
root = i;
break;
}
}
int cnt = 0;
queue<int> que;
que.push(root);
while (!que.empty()) {
int cur = que.front();
que.pop();
if (cur == -1) break;
else {
++cnt;
last = cur;
que.push(tree[cur].lson);
que.push(tree[cur].rson);
}
}
return cnt == n;
}

int main() {
scanf("%d", &n);
for (int i = 0; i<n; ++i) {
tree[i].par = tree[i].lson = tree[i].rson = -1;
}
for (int i = 0; i<n; ++i) {
char s1[5], s2[5];
int le, ri;
scanf("%s%s", s1, s2);
if (s1[0] == '-') tree[i].lson = -1;
else {
le = atoi(s1);
tree[i].lson = le;
tree[le].par = i;
}
if (s2[0] == '-') tree[i].rson = -1;
else {
ri = atoi(s2);
tree[i].rson = ri;
tree[ri].par = i;
}
}
if (bfs()) printf("YES %d\n", last);
else printf("NO %d\n", root);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: