完全二叉树

 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

提示

样例解释:样例所描述的二叉树结构如下

很显然这是一个完全二叉树。

来源


 我的状态

© 2018  JustOJ     中文  English  | Any problems please contact ismdeep@qq.com | 在线说
 
 
 
 
 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
");
42     else
43     printf("No
");
44     return  0;
45  } 
原文地址:https://www.cnblogs.com/tingtin/p/10050777.html