• 洛谷:P1087 FBI树 P1030 求先序排列 P1305 新二叉树


    至于为啥把这三个题放到一起,大概是因为洛谷的试炼场吧,三道树的水题,首先要理解

    先序中序后序遍历方法。

    fbi树由于数量小,在递归每个区间时,暴力跑一遍区间里的数,看看是否有0和1。至于递归的方法,二分递归就行。

    新二叉树就是现根据题意建树,然后求先序遍历时看一下子节点不是‘*’不是才继续向下走

    求先序遍历就是用地贵的方式实现,从后序遍历我们可以找出根节点,从中序遍历我们可以找到左右子树。

    /*FBI树*/
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define maxn 56281
    using namespace std;
    int n;
    char nam[maxn];
    int qq[maxn];
    void build(int l,int r)
    {
         int  mid=(l+r)/2; 
         if(l!=r)
         {
             build(l,mid);
             build(mid+1,r);
         }
         int n0=0,n1=0;
         for(int i=l;i<=r;i++)
         {
             if(qq[i]==1)n1++;
             if(qq[i]==0)n0++;
             if(n1&&n0)
             {
                 printf("F");
                 return;
            }
         }
         printf(n1==0?"B":"I");
    }
    int main()
    {
        scanf("%d",&n); 
        scanf("%s",nam);
        int len=strlen(nam);
        for(int i=1;i<=len;i++)
        {
            qq[i]=nam[i-1]-'0';
        }
        build(1,len);
        return 0;
    }
    /*新二叉树*/
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct root
    {
        char father;
        char rc;
        char lc;
        root()
        {
            father='?';
            lc='?';
            rc='?';
        }
    }tree[2001];
    void dfs(char x)
    {
        printf("%c",x);
        if(tree[x].lc!='*')dfs(tree[x].lc);
        if(tree[x].rc!='*')dfs(tree[x].rc);
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            char a,b,c;    
            cin>>a>>b>>c;
            tree[a].lc=b;
            tree[a].rc=c;
            tree[b].father=a;
            tree[c].father=a; 
        }
        for(int i=1;i<=2000;i++)
        {
            if(tree[i].father=='?'&&tree[i].lc!='?'&&tree[i].rc!='?')
            {
                dfs(i);
                break;
            }
        }
        return 0;
    } 
    /*求先序遍历*/
    #include<cstdio>
    #include<iostream>
    #include<string>
    using namespace std;
    string a,b;
    void qla(int ln,int rn,int l,int r)
    {
        int place=a.find(b[r]);
        cout<<b[r];
        if(place>ln)qla(ln,place-1,l,place-ln+l-1);//两棵子树 
        if(place<rn)qla(place+1,rn,place-ln+l,r-1);
    }
    int main()
    {
        cin>>a>>b;
        int len=a.size();
        qla(0,len-1,0,len-1);
        return 0;
    }
    /*
    BADC
    BDCA
    */
  • 相关阅读:
    12.python中的列表
    11.python中的元组
    10.python中的序列
    9.python的布尔类型与流程控制
    8.python中的数字
    7.python字符串-内置方法分析
    Boost--lexical_cast 一个方便安全高效的string转换库
    STL进阶--vector vs deque
    STL进阶--删除元素
    STL进阶--相等 vs 等价 (Equality vs Equivalence)
  • 原文地址:https://www.cnblogs.com/luoyibujue/p/6890221.html
Copyright © 2020-2023  润新知