hdu 3791 二叉搜索树 出锅锅了,大佬捞捞。
查看原帖
hdu 3791 二叉搜索树 出锅锅了,大佬捞捞。
461998
因幡めぐる楼主2021/8/11 13:19

题干:

开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。

如果序列相同则输出YES,否则输出NO。

因为咱第一次建二叉树,就很蠢的用map来建(体感没有问题(

findson,findson2函数基本一样,只是在用stl传map出锅了,就换了这种写法(

代码如下:

#include<cstdio>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=2e2+7;
int len;
char cmp[maxn],ori[maxn];
struct node
{
    char l='x',r='x',root='x';
    bool operator!=(const node a)const
    {
        return l!=a.l||r!=a.r||root!=a.root;
    }//node代表二叉树的每一个节点,l代表左儿子,r代表右儿子,root代表父亲节点,x代表该点为空
};
map<char,node>mp,mp2;
//findson每一次迭代会更新关于fa的左右节点,递归更新二叉树节点
void findson(char fa,char str[],int limit)
{
    int lok=0,rok=0;
    char copy[20];
    for(int i=1;i<=len;++i)copy[i]=str[i];
    if(limit>fa)
    {
        for(int i=1;i<=len;++i)
        if(copy[i]>limit)copy[i]='x';
    }
    else
    {
        for(int i=1;i<=len;++i)
        if(copy[i]<limit)copy[i]='x';
    }
    for(int i=1;i<=len;++i)
    {
        if(copy[i]=='x')continue;
        if(copy[i]<fa)
        {mp[fa].l=copy[i],copy[i]='x',lok=1;break;}
    }
    for(int i=1;i<=len;++i)
    {
        if(copy[i]=='x')continue;
        if(copy[i]>fa)
        {mp[fa].r=copy[i],copy[i]='x',rok=1;break;}
    }
    mp[mp[fa].l].root=fa;
    if(lok)mp[mp[fa].l].root=fa,findson(mp[fa].l,copy,fa);
    if(rok)mp[mp[fa].r].root=fa,findson(mp[fa].r,copy,fa);
}
void findson2(char fa,char str[],int limit)
{
    int lok=0,rok=0;
    char copy[20];
    for(int i=1;i<=len;++i)copy[i]=str[i];
    if(limit>fa)
    {
        for(int i=1;i<=len;++i)
        if(copy[i]>limit)copy[i]='x';
    }
    else
    {
        for(int i=1;i<=len;++i)
        if(copy[i]<limit)copy[i]='x';
    }
    for(int i=1;i<=len;++i)
    {
        if(copy[i]=='x')continue;
        if(copy[i]<fa)
        {mp2[fa].l=copy[i],copy[i]='x',lok=1;break;}
    }
    for(int i=1;i<=len;++i)
    {
        if(copy[i]=='x')continue;
        if(copy[i]>fa)
        {mp2[fa].r=copy[i],copy[i]='x',rok=1;break;}
    }
    mp2[mp2[fa].l].root=fa;
    if(lok)mp2[mp2[fa].l].root=fa,findson2(mp2[fa].l,copy,fa);
    if(rok)mp2[mp2[fa].r].root=fa,findson2(mp2[fa].r,copy,fa);
}
int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        mp.clear();
        scanf("%s",ori+1);
        len=strlen(ori+1);
        char tmp=ori[1];ori[1]='x';
        findson(tmp,ori,1000);
        for(int i=1;i<=n;++i)
        {
            mp2.clear();int can=1;
            scanf("%s",cmp+1);
            tmp=cmp[1];cmp[1]='x';
            findson2(tmp,cmp,1000);
            for(int j=0;j<=9;++j)
            {
                if(mp[j+'0']!=mp2[j+'0'])
                {can=0;break;}
            }
            if(can)puts("YES");
            else puts("NO");
        }
    }
    return 0;
}
2021/8/11 13:19
加载中...