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. Android字符设备驱动开发基于高通msm8916【原创 】

    本人才疏浅学,写一篇文档总结自己在msm8916平台上移植自己编写的简单的字符设备驱动开发的整个流程.这个小项目的主要功能是开发一个简单的APP,APP通过JNI去调用位于kernel的字符设备驱动. ...

  2. 吴恩达机器学习笔记(十一) —— Large Scale Machine Learning

    主要内容: 一.Batch gradient descent 二.Stochastic gradient descent 三.Mini-batch gradient descent 四.Online ...

  3. zabbix haproxy 监控

    摘自: http://www.tuicool.com/articles/JrYNNrm 写的非常好,步步紧逼,环环相扣.直到成功! 文章首发站点:OpensGalaxy 这是一个HAProxy的zab ...

  4. python之tkinter_1

    以下内容来自:https://blog.csdn.net/wangyiyan315/article/details/16361065 from tkinter import * # 导入tkinter ...

  5. ZOJ 1141 Closest Common Ancestors(LCA)

    注意:poj上的数据与zoj不同,第二处输入没有逗号 ' , ' 题意:输出测试用例中是最近公共祖先的节点,以及这个节点作为最近公共祖先的次数. 思路:直接求,两个节点一直往上爬,知道爬到同一个节点, ...

  6. C++ string的查找函数和npos特殊值

    STL中的string有6个查找函数: 1.find() 2.rfind() 从最后一个字符开始往前找. 3.find_first_of() 4.find_not_first_of() 5.find_ ...

  7. python爬虫知识点总结(一)库的安装

    环境要求: 1.编程语言版本python3: 2.系统:win10; 3.浏览器:Chrome68.0.3440.75:(如果不是最新版有可能影响到程序执行) 4.chromedriver2.41 注 ...

  8. Pmod使用的4种模式

    引言 多年以来,一直存在标准泛滥的现象,而我们电子业尤其严重.您是否曾经想过,为什么我们对有些奇怪的数字或测量计的东西建立标准?关于航天飞机的固体燃料火箭推进器的直径是否真的源自于马屁股的宽度的讨论非 ...

  9. WebService基础入门(转)

    一.概念: 1.WebService,顾名思义就是基于Web的服务.它使用Web(HTTP)方式,接收和响应外部系统的某种请求.从而实现远程调用. 2.我们可以调用互联网上查询天气信息Web服务,然后 ...

  10. sqlserver2012——使用子查询

    1 select A.成绩,A.分数,B.姓名 FROM 成绩信息 A, 学生信息 B WHERE A.学生编号=B.学号 AND A.课程编号=‘’ AND A.考试编号=‘’ AND A.分数 & ...