数据结构实验之二叉树一:树的同构

来源:互联网 发布:jb是什么意思网络用语 编辑:程序博客网 时间:2024/06/12 00:08

数据结构实验之二叉树一:树的同构

Time Limit: 1000MS Memory limit: 65536K

题目描述

给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。




图1

 


图2

现给定两棵树,请你判断它们是否是同构的。

输入

 输入数据包含多组,每组数据给出2棵二叉树的信息。对于每棵树,首先在一行中给出一个非负整数N (10),即该树的结点数(此时假设结点从0N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出”-”。给出的数据间用一个空格分隔。
注意:题目保证每个结点中存储的字母是不同的。

输出

 如果两棵树是同构的,输出“Yes”,否则输出“No”。

示例输入

8A 1 2B 3 4C 5 -D - -E 6 -G 7 -F - -H - -8G - 4B 7 6F - -A 5 1H - -C 0 -D - -E 2 -

示例输出

Yes

提示

测试数据对应图1

来源

 xam

示例程序

解法(1)
#include<stdio.h>#define MaxTree 10#define ElementType char#define Tree int#define Null -1struct TreeNode{    ElementType Element;    Tree Left;    Tree Right;}T1[MaxTree],T2[MaxTree];Tree BuildTree(struct TreeNode T[],int N){    int Root=-1;    char cl,cr,a[10],b[10],c[10];    int check[N];    if(N)        {        for(int i=0;i<N;i++)            check[i] = 0;        for(int i=0;i<N;i++)            {                scanf("%s %s %s",a,b,c);        T[i].Element=a[0];        cl=b[0];        cr=c[0];            if(cl!= '-')                {                T[i].Left = cl - '0';                check[T[i].Left] = 1;            }            else                T[i].Left = Null;            if(cr != '-')            {                T[i].Right = cr - '0';                check[T[i].Right] = 1;            }            else                T[i].Right = Null;        }        for(int i=0;i<N;i++)        {            if(!check[i])            {                Root = i;                break;            }        }    }    return Root;}int Isomorphic(Tree R1,Tree R2){    if((R1==Null)&&(R2==Null))        return 1;    if(((R1==Null)&&(R2!=Null))||((R1!=Null)&&(R2==Null)))        return 0;    if(T1[R1].Element != T2[R2].Element)        return 0;    if((T1[R1].Left == Null)&&(T2[R2].Left == Null))        return Isomorphic(T1[R1].Right,T2[R2].Right);    if(((T1[R1].Left != Null)&&(T2[R2].Left != Null))&&        ((T1[T1[R1].Left].Element)==(T2[T2[R2].Left].Element)))        return (Isomorphic(T1[R1].Left,T2[R2].Left)&&Isomorphic(T1[R1].Right,T2[R2].Right));    else        return ((Isomorphic(T1[R1].Left,T2[R2].Right))&&(Isomorphic(T1[R1].Right,T2[R2].Left)));}int main(){    int n,m;    Tree R1,R2;    while(scanf("%d",&n)!=EOF)    {        R1 = BuildTree(T1,n);        scanf("%d",&m);    R2 = BuildTree(T2,m);    if(Isomorphic(R1,R2))        printf("Yes\n");    else        printf("No\n");    }    return 0;}

解法(2)

#include<stdio.h>#include<string.h>#include<stdlib.h>struct node{    char data;    struct node *lchild,*rchild;};struct node1{    char data;    int a,b;} q[100];struct node* creat(struct node* root,int n){    root=(struct node*)malloc(sizeof(struct node));    root->lchild=NULL;    root->rchild=NULL;    root->data=q[n].data;    if(q[n].a!=-1)    {        root->lchild=creat(root->lchild,q[n].a);    }    if(q[n].b!=-1)    {        root->rchild=creat(root->rchild,q[n].b);    }    return root;}int visited[100];int num=0;int judge(struct node* p,struct node* q){    if(!p&&!q)        return 1;    else if(p&&q)    {        if(p->data!=q->data)            return 0;        else            num++;        if((judge(p->lchild,q->lchild)&&judge(p->rchild,q->rchild))||(judge(p->rchild,q->lchild)&&judge(p->lchild,q->rchild)))        {           return 1;        }        else            return 0;    }    else    return 0;}int main(){    int n,m;    char s1[10],s2[10],s3[10];    while(~scanf("%d",&n))    {        memset(visited,0,sizeof(visited));        for(int i=0; i<n; i++)        {            scanf("%s%s%s",s1,s2,s3);            q[i].data=s1[0];    if(s2[0]=='-')        q[i].a=-1;    else    {        q[i].a=s2[0]-'0';        visited[q[i].a]=1;    }    if(s3[0]=='-')        q[i].b=-1;    else    {        q[i].b=s3[0]-'0';        visited[q[i].b]=1;    }        }        int flag;        struct node *Root;        if(n!=0)        {            int j;        for(j=0;j<n;j++)            if(!visited[j])            break;        Root=creat(Root,j);        }        scanf("%d",&m);        memset(visited,0,sizeof(visited));        for(int i=0; i<m; i++)        {            scanf("%s%s%s",s1,s2,s3);            q[i].data=s1[0];    if(s2[0]=='-')        q[i].a=-1;    else    {        q[i].a=s2[0]-'0';        visited[q[i].a]=1;    }    if(s3[0]=='-')        q[i].b=-1;    else    {        q[i].b=s3[0]-'0';        visited[q[i].b]=1;    }        }        int j;        for(j=0;j<m;j++)            if(!visited[j])            break;        struct node *root;        root=creat(root,j);        num=0;        judge(Root,root);            if(num==n)                printf("Yes\n");        else            printf("No\n");    }    return 0;}


1 0
原创粉丝点击