完全二叉树
H: CBT?
时间限制: 1 s 内存限制: 128 MB
题目描述
对于二叉树,如果这棵树的节点排布是按行从上到下,每行从左到右挨个放置,中间不会有空闲的节点。则我们称之为完全二叉树。
注:这棵树的根节点的值一定是1
输入
输入数字正整数n (1≤n≤201≤n≤20)
接下来n行,每行为两个数字(a,b)和一个字符c(L 或者 R),如果字符c是L,则表示b是a的左子节点;如果字符c是R,则表示b是a的右子节点。 (1≤a,b≤30001≤a,b≤3000)
输出
判断这棵树是否为完全二叉树,如果是则输出Yes,否则输出No
样例输入
5
1 2 L
1 3 R
2 4 L
2 5 R
3 6 L
样例输出
Yes
提示
样例解释:样例所描述的二叉树结构如下
很显然这是一个完全二叉树。
来源
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 #include <queue> 7 using namespace std; 8 const int N =1e5+10; 9 struct Node{ 10 int l=0; 11 int r=0; 12 }node[100]; 13 int n; 14 int a,b; 15 int flag=1; 16 char c; 17 queue<int>Q; 18 bool bfs(int x){ 19 Q.push(x); 20 while(!Q.empty()){ 21 int u=Q.front(); 22 Q.pop(); 23 if(!flag&&node[u].l!=0) return 0;//叶子节点没有孩子 24 if(node[u].l==0&&node[u].r!=0) return 0;//不可能有右无左 25 if(node[u].l==0||node[u].r==0) flag=0;//以后的节点一定都是叶子节点了 26 if(node[u].l!=0) Q.push(node[u].l);//必须从左到右查询 27 if(node[u].r!=0) Q.push(node[u].r); 28 } 29 return 1; 30 } 31 int main() 32 { 33 scanf("%d",&n); 34 for(int i=0;i<n;i++){ 35 scanf("%d%d",&a,&b); 36 cin>>c; 37 if(c=='L') node[a].l=b; 38 else node[a].r=b; 39 } 40 if(bfs(1)) 41 printf("Yes\n"); 42 else 43 printf("No\n"); 44 return 0; 45 }