当前位置:   article > 正文

对称二叉树_如果二叉树的左右子树的结构是对称的,即两棵子树皆为空,或者皆不空,则称该二叉树

如果二叉树的左右子树的结构是对称的,即两棵子树皆为空,或者皆不空,则称该二叉树

题目

如果二叉树的左右子树的结构是对称的,即两颗子树皆为空,或者皆不为空,则称该二叉树是对称的。编程判断给定的二叉树是否对称。

例:如图中的二叉树T1是对称的,T2是不对称的。

二叉树用顺序结构给出,若读到#则为空,二叉树T1=ABCDE,T2=ABCD#E,如果二叉树是对称的,输出“Yes",反之输出”No".

样例

样例输入1

ABCDE

样例输出1

Yes

 一开始,乍一看,不就是二叉树吗?判断一下节点数量符不符合要求,再看空位合不合理不就好了吗,然后就狂敲代码,打出了这段代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. string a;
  4. long long p(int n){
  5. long long sum=1;
  6. for(int i=1;i<=n;i++){
  7. sum*=2;
  8. }
  9. return sum;
  10. }
  11. int main(){
  12. cin>>a;
  13. long long sum=0,len=a.size()-1;
  14. if(len%2==1){
  15. cout<<"No";
  16. return 0;
  17. }else{
  18. if(a.find('#')!='#'){
  19. for(int i=1;i<=len;i+=2){
  20. if((a[i]=='#'&&a[i+1]!='#')||(a[i]!='#'&&a[i]=='#')){
  21. cout<<"No";
  22. return 0;
  23. }
  24. }
  25. }
  26. for(int i=1;len>0;i++){
  27. int u=p(i);
  28. if(len-u<0){
  29. int y=len;
  30. for(;y!=1;){
  31. if(y%2==1){
  32. break;
  33. }
  34. else{
  35. y/=2;
  36. }
  37. }
  38. if(y!=1){
  39. cout<<"No";
  40. return 0;
  41. }
  42. }
  43. len-=u;
  44. }
  45. cout<<"Yes";}
  46. }

问题是

 仔细想想我刚刚思路与代码,你有没有发现什么区别呢?

我为什么要去判断字符串长度合不合理呢?

既然空位都标出来了,那判断空位合不合理不就好了

说具体点,就是判断每个子树是不是完整的,不完整,他就不是对称二叉树

Code

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. string a;
  4. int main()
  5. {
  6. cin>>a;
  7. long long sum=0,len=a.size()-1;
  8. if(a[len]=='#'||len%2==1) {
  9. cout<<"No";
  10. return 0;
  11. } else {
  12. if(a.find('#')!='#') {
  13. for(int i=1; i<=len; i+=2) {
  14. if((a[i]=='#'&&a[i+1]!='#')||(a[i]!='#'&&a[i]=='#')) {
  15. cout<<"No";
  16. return 0;
  17. }
  18. }
  19. }
  20. }
  21. cout<<"Yes";
  22. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/article/detail/50406
推荐阅读
相关标签
  

闽ICP备14008679号