判断是否是完全二叉树
H: CBT?
Time Limit: 1 s Memory Limit: 128 MB
Problem Description
对于二叉树,如果这棵树的节点排布是按行从上到下,每行从左到右挨个放置,中间不会有空闲的节点。则我们称之为完全二叉树。
注:这棵树的根节点的值一定是1
Input
输入数字正整数n (1≤n≤20
)
接下来n行,每行为两个数字(a,b)和一个字符c(L 或者 R),如果字符c是L,则表示b是a的左子节点;如果字符c是R,则表示b是a的右子节点。 (1≤a,b≤3000
)
Output
判断这棵树是否为完全二叉树,如果是则输出Yes,否则输出No
Sample Input
5
1 2 L
1 3 R
2 4 L
2 5 R
3 6 L
Sample Output
Yes
Hint
样例解释:样例所描述的二叉树结构如下
很显然这是一个完全二叉树。
是完全二叉树的几种情况:
(1)、只有根节点
(2)、每一个节点都有左右节点或者是有左节点但没有右节点
#include<iostream> #include<string.h> #include<queue> #include<stdio.h> using namespace std; struct p { int num; int l; int r; }p[2000]; int main() { int n,a,b; char s; cin>>n; for(int i=1;i<=n+1;i++)//有n条描述,但是有n+1个节点 { p[i].l=0; p[i].r=0; } for(int i=0;i<n;i++) { cin>>a>>b>>s; if(s=='L') p[a].l=b; else p[a].r=b; p[a].num=a; } int cnt=0; for(int i=1;i<=n+1;i++) { if(p[i].l!=0&&p[i].r!=0) { cnt++; continue; } if(p[i].l!=0&&p[i].r==0) { cnt++; continue; } if(p[i].l==0&&p[i].r==0) { cnt++; continue; } } if(cnt==n+1) cout<<"Yes"<<endl; else cout<<"No"<<endl; return 0; }
等风起的那一天,我已准备好一切