4 solutions

  • 2
    @ 2024-4-25 13:44:49

    题意:

    在一个二叉树(应该是层次遍历)里如果是空或是都不空就输出"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
      @ 2024-1-6 10:07:48

      题意

      输入二叉树的层次遍历,# 代表空子树

      思路

      原本是这样想的:连着的 # 如果是偶数个,就是正确

      但是

      这忽略了不同层的 #

      所以

      我们用一个字符串保存当前层的节点

      然后就可以和原本想的那样做了

      代码

      #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
        @ 2024-1-5 19:33:24

        本以为好难,结果好简单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;//完结散花
        }
        
        • -3
          @ 2023-12-27 20:02:09

          大家先别做!!!测试数据没有,做了也是白做!!!!!!!!!!!!!!!!!!!!!

          • 1

          Information

          ID
          853
          Time
          1000ms
          Memory
          256MiB
          Difficulty
          8
          Tags
          # Submissions
          153
          Accepted
          22
          Uploaded By