4 solutions
-
2
题意:
在一个二叉树(应该是层次遍历)里如果是空或是都不空就输出"Yes",否则"No"
思路:
如果是对称二叉树,对于每一个字母必有它的子树,要么是"##",要么是"**"(代表两个字符)
那么只要判断当有"#"或字符时,只要判断后一个字符就可以了
还要用一个变量做标记
#include<iostream> #include<string> using namespace std; int main() { string s; bool f=0;//标记的变量 cin>>s;//输入 if(s.size()%2==0)//一定长度为奇数(多1的是根节点),不能为偶数,不然就不对称了 { cout<<"No";//输出 return 0;//完结散花 } for(int i=1;i<s.size();i++)//从一开始(不算根节点)!!! { if((s[i]=='#' && s[i+1]=='#') || (s[i]!='#' && s[i]!='#'))//符合对称二叉树时 { i++;//后移1位 } else { f=1;//标记 } } if(!f)//都符合时 { cout<<"Yes";//输出 } else { cout<<"No";//输出 } return 0;//完结散花 }
-
0
题意
输入二叉树的层次遍历,# 代表空子树
思路
原本是这样想的:连着的 # 如果是偶数个,就是正确的
但是
这忽略了不同层的 #
所以
我们用一个字符串保存当前层的节点
然后就可以和原本想的那样做了
代码
#include <bits/stdc++.h> using namespace std; string s; bool bfs(){ string ceng = ""; // 该层的节点 int ci = 0,p = 1; // p 为该层最多的节点数 for (int i = 0;s[i];i++){ ceng[ci++] = s[i]; // 将该节点加入层数节点串中 if (ci == p){ // 如果这一层遍历完了,就检测谁的子树不符合要求 for(int j = 0;ceng[j];j++){ if ((ceng[j] == '#' && ceng[j + 1] == '#') || ceng[j] != '#'){ j += 1; // 由于循环完毕后会 j++,所以这里只用加 1 }else{ return 0; // 不符合就返回 No } } ceng = ""; // 重置层数 ci = 0; p *= 2; } } return 1; } int main(int argc, char **argv){ cin >> s; if (s.size() % 2 == 0) {printf("No");return 0;} // 如果字符串长度为偶数,那么肯定不是对称二叉树 if (bfs()) printf("Yes"); else printf("No"); return 0; }
-
0
本以为好难,结果好简单
water题意:
在一个二叉树(应该是层次遍历)里如果是空或是都不空就输出"Yes",否则"No"
思路:
如果是对称二叉树,对于每一个字母必有它的子树,要么是"##",要么是"**"(代表两个字符)
那么只要判断当有"#"或字符时,只要判断后一个字符就可以了
还要用一个变量做标记
#include<iostream> #include<string> using namespace std; int main() { string s; bool f=0;//标记的变量 cin>>s;//输入 if(s.size()%2==0)//一定长度为奇数(多1的是根节点),不能为偶数,不然就不对称了 { cout<<"No";//输出 return 0;//完结散花 } for(int i=1;i<s.size();i++)//从一开始(不算根节点)!!! { if((s[i]=='#' && s[i+1]=='#') || (s[i]!='#' && s[i]!='#'))//符合对称二叉树时 { i++;//后移1位 } else { f=1;//标记 } } if(!f)//都符合时 { cout<<"Yes";//输出 } else { cout<<"No";//输出 } return 0;//完结散花 }
- 1
Information
- ID
- 853
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 8
- Tags
- # Submissions
- 153
- Accepted
- 22
- Uploaded By