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 (≤20) 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 分析:判断是否是完全二叉树。先求根节点,可以设置一个数组child,如果输入过程中如果该结点被当做孩子节点那它一定不是根节点,输入完毕后从头开始遍历child数组,第一个是false的child[i]跳出,i就是根节点。那么如何判断是完全二叉树呢?这里提供两种方法。 1、层序遍历,每次把空节点也Push进队列中,完全二叉树层序遍历过程中,如果遇到空节点了,说明一定已经遍历完非空节点;而对非完全二叉树,如果遇到空节点了,后面还必定有非空节点。于是遍历过程中用一个变量统计已入队过的节点数量。
2、递归求最大下标值,完全二叉树中,最大下标值=最大结点数(起始为1); 而非完全二叉树中,最大下标值>最大结点数

代码分别如下:
/**
* Copyright(c)
* All rights reserved.
* Author : Mered1th
* Date : 2019-02-26-21.04.42
* Description : A1110
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<unordered_set>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
struct Node{
int l,r;
}node[];
]={false};
,n;
bool isCBT(int root){
;
queue<int>q;
q.push(root);
while(!q.empty()){
int top=q.front();
q.pop();
){
maxd=top;
cnt++;
q.push(node[top].l);
q.push(node[top].r);
}
else{
if(cnt==n) return true;
else return false;
}
}
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
cin>>n;
string a,b;
;i<n;i++){
cin>>a>>b;
]=='-'){
node[i].l=-;
}
else{
node[i].l=stoi(a);
child[stoi(a)]=true;
}
]=='-'){
node[i].r=-;
}
else{
node[i].r=stoi(b);
child[stoi(b)]=true;
}
}
int root;
;i<n;i++){
if(child[i]==false){
root=i;
break;
}
}
if(isCBT(root)) printf("YES %d",maxd);
else printf("NO %d",root);
;
}
这里利用了二叉树静态存储的性质,即父节点和叶子节点之间的关系。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
struct node{
int data;
int l,r;
}Node[];
,n;
]={false};
/*void LayerOrder(int root){
queue<int> Q;
Q.push(root);
while(!Q.empty()){
int now=Q.front();
Q.pop();
if(Node[now].l!=-1){
if(Node[now].r!=-1){
cnt++;
Q.push(Node[now].l);
}
else{
cnt++;
}
}
if(Node[now].r!=-1){
if(Node[now].l!=-1){
cnt++;
Q.push(Node[now].r);
}
else{
cnt++;
}
}
}
}
*/
,ans;
void dfs(int root,int index){
//求出最大下标值,如果下标值等于最大节点数-1则说明是完全二叉树,若大于最大结点数-1则非完全二叉树
if(index>maxn){
maxn=index;
ans=root;
}
) dfs(Node[root].l,index*);
) dfs(Node[root].r,index*+);
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
cin>>n;
string t1,t2;
;i<n;i++){
cin>>t1>>t2;
Node[i].data=i;
if(t1=="-"){
Node[i].l=-;
}
else{
Node[i].l=stoi(t1);
hashtable[stoi(t1)]=true;
}
if(t2=="-"){
Node[i].r=-;
}
else{
Node[i].r=stoi(t2);
hashtable[stoi(t2)]=true;
}
}
int i;
;i<n;i++){
if(hashtable[i]==false) break;
}
dfs(i,);
if(maxn==n){
cout<<"YES "<<ans;
}
else{
cout<<"NO "<<i;
}
;
}
1110 Complete Binary Tree (25 分)的更多相关文章
- 1110 Complete Binary Tree (25 分)
Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each in ...
- 【PAT甲级】1110 Complete Binary Tree (25分)
题意: 输入一个正整数N(<=20),代表结点个数(0~N-1),接着输入N行每行包括每个结点的左右子结点,'-'表示无该子结点,输出是否是一颗完全二叉树,是的话输出最后一个子结点否则输出根节点 ...
- [二叉树建树&完全二叉树判断] 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 ...
- 1110. Complete Binary Tree (25)
Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each in ...
- 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 ...
- PAT甲题题解-1110. Complete Binary Tree (25)-(判断是否为完全二叉树)
题意:判断一个节点为n的二叉树是否为完全二叉树.Yes输出完全二叉树的最后一个节点,No输出根节点. 建树,然后分别将该树与节点树为n的二叉树相比较,统计对应的节点个数,如果为n,则为完全二叉树,否则 ...
- PAT (Advanced Level) 1110. Complete Binary Tree (25)
判断一棵二叉树是否完全二叉树. #include<cstdio> #include<cstring> #include<cmath> #include<vec ...
- PAT甲级——1110 Complete Binary Tree (完全二叉树)
此文章同步发布在CSDN上:https://blog.csdn.net/weixin_44385565/article/details/90317830 1110 Complete Binary ...
- 1110 Complete Binary Tree
1110 Complete Binary Tree (25)(25 分) Given a tree, you are supposed to tell if it is a complete bina ...
随机推荐
- 使用MyEclipse开发Java EE应用:EJB项目开发初探(上)
你开学,我放价!MyEclipse线上狂欢继续!火热开启中>> [MyEclipse最新版下载] 一.MyEclipse EJB开发工具 Enterprise Java Beans (EJ ...
- 关于学习JAVA程序设计语言的回顾与展望
回顾篇 时光荏苒,大学生活已然过半.看了老师分享的几篇博文,我的内心是震憾并且惭愧的.相比别人,自己做的实在是不够多,不够好.在刚刚结束的大二上半学期,我学习了JAVA初级程序设计,虽然每节课都认真听 ...
- python struct模块的使用
struct模块中的函数 函数 return explain pack(fmt,v1,v2…) string 按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回. pack_in ...
- fopen & fcolse & fseek & ftell & fstat 文件操作函数测试
1.文件大小查询file_size.c 方法一:fseek + ftell: 方法二:ftell #include <stdio.h> #include <fcntl.h> # ...
- Appium 并发多进程基于 Pytest框架
前言: 之前通过重写unittest的初始化方法加入设备参数进行并发,实现了基于unittest的appium多设备并发,但是考虑到unittest的框架实在过于简陋,也不方便后期的Jenkins的持 ...
- P1174 互素
P1174 互素 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 对于某个数n,,我们这次的工作仅是求出小于n且和n互质的数的个数,,比如n=10时 1,3, ...
- Word2007:如何在竖版(纵向)页面中间插入横版(横向)页面
通常情况下,我们在word排版过程中使用一种页面版式(横版/竖版)即可.但在某些特殊情况下,我们可能会需要在竖版页面中间插入一页或多页横版页面,抑或在横版页面中间插入竖版页面.那么,如何针对这 ...
- ajax提交post请求出现数组被截断情况的解决方法
一.场景 php post 提交数据时传的数据时数组,没有多数据进行序列化处理.发现传到服务端时,部分数据丢失,查询了资料发现php对参数个数有限制,限制在php配置文件中(max_input_var ...
- 多重背包!!!(二进制优化的01背包)hdoj-2844
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- 【网络通讯】Nat知识了解
一.Nat的含义 NAT(Network Address Translation,网络地址转换)是1994年提出的.当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址 ...
