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 ...
随机推荐
- iOS9 http 不能连接的解决办法
iOS9要求App内访问的网络必须使用HTTPS协议.原有的HTTP请求会报错,适配方法如下. 打开TARGETS-Build Phases, 添加New Run Script Phase,代码如下: ...
- 如何提升ACTION_SIM_STATE_CHANGED的接收速度?
在Android中,BroadcastReceiver分动态注册和静态注册. 静态注册的一个优势就是:当你的BroadcastReceiver可以接受系统中 某个broadcast时,系统会自动启动你 ...
- CentOS 6.6安装postgresql9.6.6
一.环境介绍 系统平台:CentOS release 6.6 (Final) Postgresql:postgresql-9.6.6 二.安装过程 1.安装依赖包 yum -y install gcc ...
- [Spring Boot] Spring Boot启动过程源码分析
关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Spring-boot 1.5.6)的角度来看看Spring Boot的启动过程到底是怎么样的,为何以往纷繁复杂的配置到 ...
- svn忽略文件后缀
*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo *.rej *~ #*# .#* .*.swp .DS_Store Release ...
- PyTorch 数据集类 和 数据加载类 的一些尝试
最近在学习PyTorch, 但是对里面的数据类和数据加载类比较迷糊,可能是封装的太好大部分情况下是不需要有什么自己的操作的,不过偶然遇到一些自己导入的数据时就会遇到一些问题,因此自己对此做了一些小实 ...
- 使用Django+MySQL+Apache+Linux创建简单的博客
本教程基于慕课网<Django入门与实践>编写,基于CentOS 7 基础知识 什么是django? Django是一个基于Python的高级Web开发框架, 特点:高效,快速,高度集成( ...
- HDU 4669 Mutiples on a circle 数位DP
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4669 考察对取模的的理解深不深刻啊,当然还有状态的设计····设d[i][j]表示以第i个数结尾,余 ...
- Java-JDK & Android SDK下载安装及配置教程
转自:http://blog.csdn.net/dr_neo/article/details/49870587 第一步.安装JDK: 第二步.安装Eclipse: 第三步.下载并安装AndroidSD ...
- jquery遍历节点 children(),next(),prev(),siblings()closest() 等一些常用方法...
函数 描述 .add() 将元素添加到匹配元素的集合中. .andSelf() 把堆栈中之前的元素集添加到当前集合中. .children() 返回被选元素旗下的所有直接子元素 .closest() ...