SDUT 3340 树的同构

链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/3340.html

思路:

很常见的思路,将两颗树格式化,然后xjb比较一下就ok了

当然我这里用的是比较偷懒的写法,格式化后通过比较先序序列是否相同

格式化可以根据左右孩子节点的值来排列左右两个节点谁在左谁在右

但需要注意的一点是题目没有给出根节点,要先找出根节点

#include<bits/stdc++.h>
using namespace std;

const int maxN=15;

struct node{
    char c;
    int l,r,p;
    node():l(-1),r(-1),p(-1){}
}a[maxN],b[maxN];

void format(node t[],int r){
    if(~t[r].l)format(t,t[r].l);
    if(~t[r].r)format(t,t[r].r);
    if(t[r].l==-1)swap(t[r].l,t[r].r);
    else if(t[r].r!=-1&&t[r].l!=-1&&t[t[r].l].c>t[t[r].r].c)swap(t[r].l,t[r].r);
}

void dfs(node t[],int r,string& s){
    s+=t[r].c;
    if(~t[r].l)dfs(t,t[r].l,s);
    if(~t[r].r)dfs(t,t[r].r,s);
}

int find(node t[],int x){
    if(t[x].p==-1)return x;
    else return find(t,t[x].p);
}

int main(){
    int m,n;
    char c,l,r;
    while(cin>>m){
        memset(a,-1,sizeof(a));
        memset(b,-1,sizeof(b));
        for(int i=0;i<m;i++){
            cin>>c>>l>>r;
            a[i].c=c;
            if(l!='-'){
                a[i].l=l-'0';
                a[l-'0'].p=i;
            }
            if(r!='-'){
                a[i].r=r-'0';
                a[r-'0'].p=i;
            }
        }
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>c>>l>>r;
            b[i].c=c;
            if(l!='-'){
                b[i].l=l-'0';
                b[l-'0'].p=i;
            }
            if(r!='-'){
                b[i].r=r-'0';
                b[r-'0'].p=i;
            }
        }
        if(m!=n){
            cout<<"No"<<endl;
            continue;
        }
        int ra=find(a,0),rb=find(b,0);
        format(a,ra);
        format(b,rb);
        string pa,pb;
        dfs(a,ra,pa);
        dfs(b,rb,pb);
        if(pa==pb)cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
}

猜你喜欢

转载自www.cnblogs.com/TAMING/p/9221356.html
今日推荐