完全二叉树
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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现