1110 Complete Binary Tree (25 分)
 

Given a tree, you are supposed to tell if it is a complete binary tree.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤) which is the total number of nodes in the tree -- and hence the nodes are numbered from 0 to N−1. Then N lines follow, each corresponds to a node, and gives the indices of the left and right children of the node. If the child does not exist, a - will be put at the position. Any pair of children are separated by a space.

Output Specification:

For each case, print in one line YES and the index of the last node if the tree is a complete binary tree, or NO and the index of the root if not. There must be exactly one space separating the word and the number.

Sample Input 1:

9
7 8
- -
- -
- -
0 1
2 3
4 5
- -
- -

Sample Output 1:

YES 8

Sample Input 2:

8
- -
4 5
0 6
- -
2 3
- 7
- -
- -

Sample Output 2:

NO 1

题目大意:一棵树有N个节点,从0到N-1进行标记,每一行代表了一个节点的左孩子和右孩子的信息,若没有孩子,以'-'代替。要求判断它是否为完全二叉树,若是完全二叉树则输出"YES"以及最后一个节点的值,反之输出“NO”和根节点的值。

思路:建立二叉树 —> 寻找根节点 —> 判断是否为完全二叉树。二叉树用数组储存,将'-'转换成-1来标明左孩子或者右孩子为空;用bool数组isRoot来给孩子节点进行标记,然后遍历isRoot寻找根节点;最后进行完全二叉树的判断,判断的依据是:层序遍历该二叉树,1、若当前节点的左孩子为空,右孩子不为空,则非完全二叉树;2、若发现某个节点没有右孩子则进行标记,在这之后入队的节点如果不是叶子节点那么就不是完全二叉树。

 #include <iostream>
#include <vector>
#include <string>
#include <queue>
using namespace std;
struct node {
int key, left, right;
};
int getNum(string &s);
bool isComplete(vector <node> &tree, int root, int &lastNode);
int main()
{
int N, root, lastNode;
scanf("%d", &N);
vector <node> tree(N);
vector <bool> isRoot(N, true);
for (int i = ; i < N; i++) {
string s1,s2;
cin >> s1 >> s2;
tree[i].key = i;
tree[i].left = getNum(s1);
tree[i].right = getNum(s2);
if (tree[i].left != -)
isRoot[tree[i].left] = false;
if (tree[i].right != -)
isRoot[tree[i].right] = false;
}
for (int i = ; i < N; i++)
if (isRoot[i]) {
root = i;
break;
}
bool flag = isComplete(tree, root, lastNode);
if (flag)
printf("YES %d\n", lastNode);
else
printf("NO %d\n", root);
return ;
}
bool isComplete(vector <node> &tree, int root, int &lastNode) {
bool flag = false;
queue <int> Q;
Q.push(root);
int t;
while (!Q.empty()) {
t = Q.front();
Q.pop();
if (tree[t].left == - && tree[t].right != -)
return false;
if (flag) {//在标记之后再次发现非叶子节点,不是完全二叉树
if (!(tree[t].left == - && tree[t].right == -)) {
return false;
}
}
if (tree[t].right == -)//如果发现某个节点没有右孩子,就标记下,在这之后进入队列的节点要都是叶子节点才能满足完全二叉树的性质
flag = true;
if (tree[t].left != -)
Q.push(tree[t].left);
if (tree[t].right != -)
Q.push(tree[t].right);
if (Q.empty())
lastNode = tree[t].key;
}
return true;
}
int getNum(string &s) {
if (s[] == '-')
return -;
int n = ;
for (int i = ; i<s.length(); i++)
n = n * + s[i] - '';
return n;
}

PAT甲级——1110 Complete Binary Tree (完全二叉树)的更多相关文章

  1. PAT 甲级 1110 Complete Binary Tree

    https://pintia.cn/problem-sets/994805342720868352/problems/994805359372255232 Given a tree, you are ...

  2. PAT甲级——A1110 Complete Binary Tree【25】

    Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each in ...

  3. PAT Advanced 1110 Complete Binary Tree (25) [完全⼆叉树]

    题目 Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each ...

  4. PAT 1110 Complete Binary Tree[判断完全二叉树]

    1110 Complete Binary Tree(25 分) Given a tree, you are supposed to tell if it is a complete binary tr ...

  5. [二叉树建树&完全二叉树判断] 1110. Complete Binary Tree (25)

    1110. Complete Binary Tree (25) Given a tree, you are supposed to tell if it is a complete binary tr ...

  6. PAT 1110 Complete Binary Tree[比较]

    1110 Complete Binary Tree (25 分) Given a tree, you are supposed to tell if it is a complete binary t ...

  7. 1110 Complete Binary Tree (25 分)

    1110 Complete Binary Tree (25 分) Given a tree, you are supposed to tell if it is a complete binary t ...

  8. 1110 Complete Binary Tree

    1110 Complete Binary Tree (25)(25 分) Given a tree, you are supposed to tell if it is a complete bina ...

  9. pat 甲级 1064. Complete Binary Search Tree (30)

    1064. Complete Binary Search Tree (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...

随机推荐

  1. 0CTF 2017 部分Web的某些不一样的思路

    洒家参加了0CTF 2017,做了一些题目.赛后过了好几天,看网上已经有了一些写得不错的Writeup,这里就写一写洒家的一些不一样的思路. 一些不错的Writeup https://ctftime. ...

  2. Contiki 2.7 Makefile 文件(三)

    2.第二部分 这里的usage,targets,savetarget,savedefines都是伪目标. 和all不同,这些伪目标不会被执行,除非显式指定这些目标. 这里有两个目标savetarget ...

  3. RQNOJ 328 炮兵阵地:状压dp

    题目链接:https://www.rqnoj.cn/problem/328 题意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队. 一个N*M的地图由N行M列组成(N≤100,M≤10), ...

  4. 读《nodejs开发指南》记录

    最近看了一下<nodejs开发指南>发现nodejs在某些特定的领域由他自己的长处,适合密集计算但是业务逻辑比较简单的场景,如果做网站还是选择php吧,呵呵,这本书我除了第5章<用n ...

  5. 【HDU 3487】Play with Chain Splay

    题意 给定$n$个数序列,每次两个操作,将区间$[L,R]$拼接到去掉区间后的第$c$个数后,或者翻转$[L,R]$ Splay区间操作模板,对于区间提取操作,将$L-1$ Splay到根,再将$R+ ...

  6. c macro pair

    成对使用的macro, 不过也有机会用错, 死都不知道怎么死的, 这宏... #define pthread_cleanup_push(func, val) \ { \ struct __darwin ...

  7. 如何在Mac下显示Finder中的所有文件

    在Unix下工作,你可能需要处理一些“特殊“文件或文件夹,例如/usr,/bin, etcf,或一些"dot files"(如.bash_profile).但是Linux/Unix ...

  8. MySQL常用的数据类型及函数_20160920

    1.常用数据类型 针对创建数据表时候 需要指定字段的数据类型,我整理的是工作常用的几种 可以参考看下数据类型 http://www.w3school.com.cn/sql/sql_datatypes. ...

  9. BZOJ1878:[SDOI2009]HH的项链

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...

  10. ubuntu14.04 设置默认使用root用户登录

    首先修改/etc/lightdm/lightdm.conf,设置autologin-user=root 但是此时直接重启,会报如下的错误: 解决办法: 使用命令: vim /root/.profile ...