[2004年NOIP普及组] FBI树

[2004年NOIP普及组] FBI树

  • 分析:根据题意,根据01字符构建树,然后根据01字符所代表的字母后序遍历输出,首先是在长度只有1时看所对应的字母是哪个,然后就是长度不为1时,使用截取字符函数(substr)分别截取前半部分和后半部分,然后进行递归,最后是跟据题意输出(只是将原本的数字换成了有意义的字母)
  • 根据样例建树

 

 

  • #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int dfs(string s)
    {
    int len=s.length();//求长度
    if(len==1)//当只有一个字母时
    {
    if(s[0]=='0')
    {
    cout<<"B";
    return 0;
    }
    if(s[0]=='1')
    {
    cout<<"I";
    return 1;
    }
    }
    //后序遍历 递归
    int x=dfs(s.substr(0,len/2));//从0开始 截取len/2个为左子树
    int y=dfs(s.substr(len/2,len/2));//从len/2开始 截取len/2个为右子树
    if(x==2||y==2||x!=y)//两者都有
    {
    cout<<"F";
    return 2;
    }
    else if(x==0&&y==0)
    {
    cout<<"B";
    return 0;
    }
    else if(x==1&&y==1)
    {
    cout<<"I";
    return 1;
    }
    }
    int main()
    {
    string s;
    int n;
    cin>>n;
    cin>>s;
    dfs(s);//调用
    return 0;
    }

posted @ 2022-08-15 11:36  4lovls  阅读(84)  评论(0)    收藏  举报