H: CBT?



时间限制: 1 s      内存限制: 128 MB     

提交 我的状态

题目描述


对于二叉树,如果这棵树的节点排布是按行从上到下,每行从左到右挨个放置,中间不会有空闲的节点。则我们称之为完全二叉树。

注:这棵树的根节点的值一定是1


输入


输入数字正整数n (1n201≤n≤20)

接下来n行,每行为两个数字(a,b)和一个字符c(L 或者 R),如果字符c是L,则表示b是a的左子节点;如果字符c是R,则表示b是a的右子节点。 (1a,b30001≤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 }