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

来源:互联网 发布:mac ssh命令 端口 编辑:程序博客网 时间:2024/05/17 07:18

点击打开链接

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

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

#include<stdio.h>#include<stdlib.h>typedef struct tnode{    char data;    struct tnode *lc,*rc;}tnode,*tree;struct node{    char data;    int l,r;}order[10];tree creat(int n){    tree T;    T=(tree)malloc(sizeof(tnode));    T->lc=T->rc=NULL;            //初始左右子树为空,若判断不为空重新赋值    T->data=order[n].data;    if(order[n].l!=-1)           //如果左子树不为空,左建树        T->lc=creat(order[n].l);    if(order[n].r!=-1)        T->rc=creat(order[n].r); //如果右子树不为空,右建树    return T;}tree build(int n){    int i;    int flag[10]={0};            //用于判断根,遍历所有被指向的节点,没有被指向的节点为根    for(i=0;i<n;i++)    {        char s1[5],s2[5],s3[5];        scanf("%s%s%s",s1,s2,s3);        order[i].data=s1[0];        if(s2[0]=='-')            order[i].l=-1;        else        {            order[i].l=s2[0]-'0'; //将左子树的位置存入order            flag[order[i].l]=1;           }        if(s3[0]=='-')            order[i].r=-1;        else        {            order[i].r=s3[0]-'0'; //将右子树的位置存入order            flag[order[i].r]=1;        }    }    if(n!=0)    {        for(i=0;i<n;i++)          //便历找到根            if(!flag[i])                break;    }    tree T=creat(i);              //从跟开始建树    return T;}int judge(tree T1,tree T2)       {    if(T1==NULL&&T2==NULL)        //如果T1,T2同时为空,则同构,这里的T1,T2并不一定是整个树        return 1;    else if(T1!=NULL&&T2!=NULL)   //如果同时不为空,并且当前节点值相同,进行下一步的判断    {        if(T1->data==T2->data)    //即左子树与左子树&&右子树与右子树,左子树与右子树&&右子树与左子树        {            if((judge(T1->lc,T2->lc)&&judge(T1->rc,T2->rc))||(judge(T1->rc,T2->lc)&&judge(T1->lc,T2->rc)))                return 1;        }    }    return 0;                     //若不符合以上条件,如T1为空,T2不空,则不同构}int main(){    int n;    tree T1,T2;    while(~scanf("%d",&n))    {        T1=build(n);        scanf("%d",&n);                    T2=build(n);          if(judge(T1,T2))            printf("Yes\n");        else            printf("No\n");    }    return 0;}


0 0
原创粉丝点击