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

来源:互联网 发布:短信王软件 编辑:程序博客网 时间:2024/06/06 08:59

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

Time Limit: 1000MS Memory Limit: 65536KB
SubmitStatistic

Problem Description

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




图1

 


图2

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

Input

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

Output

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

Example Input

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 -

Example Output

Yes

Hint

测试数据对应图1

Author

 xam
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<iostream>using namespace std;typedef struct node//建立以三个数组建立形成的树{    char data;    int l;    int r;}tree;tree T1[10],T2[10];int build(tree T[], int n)//将题目数据建立树{    int root = -1;    char cl,cr,a[10],b[10],c[10];    int check[10] = {0};//标记,并寻找根    if(n)    {       for(int i=0;i<n;i++)       {           scanf("%s%s%s",a,b,c);           T[i].data = a[0];           cl = b[0];           cr = c[0];           if(cl!='-')           {             T[i].l = cl-48;             check[T[i].l] = 1;//           }           else             T[i].l = -1;             if(cr!='-')             {                T[i].r = cr-48;                check[T[i].r] = 1;             }             else T[i].r = -1;       }       for(int i=0;i<n;i++)       {          if(!check[i])          {             root = i;             break;          }       }    }  return root;}int cmp(int r1,int r2)//递归查找左右是否相等{ //前三个判断均比较的是当前情况   if((r1==-1)&&(r2==-1))//递归到叶子时,返回   return 1;   if((r1==-1&&r2!=-1)||(r1!=-1&&r2==-1))//数据不相等或结构不对称时退出   return 0;   if(T1[r1].data!=T2[r2].data)    return 0;    if(T1[r1].l==-1&&T2[r2].l==-1)//左节点不存在时,处理右节点      return cmp(T1[r1].r,T2[r2].r);    if(T1[r1].l!=-1&&T2[r2].l!=-1   //左节点存在且相等时,对应比较    &&T1[T1[r1].l].data==T2[T2[r2].l].data)    return (cmp(T1[r1].l, T2[r2].l)//递归比较下一层    &&cmp(T1[r1].r, T2[r2].r));  else return (cmp(T1[r1].r, T2[r2].l)//其余情况,交换比较,直到递归出口结束  &&cmp(T1[r1].l, T2[r2].r));}int main(){  int n,m;  int r1,r2;  while(~scanf("%d",&n))  {     r1 = build(T1,n);     scanf("%d",&m);     r2 = build(T2,m);     if(cmp(r1,r2))       printf("Yes\n");    else    printf("No\n");  }return 0;}/***************************************************User name: jk160505徐红博Result: AcceptedTake time: 0msTake Memory: 152KBSubmit time: 2017-02-07 19:48:57****************************************************/


 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在肯德基买的券过期了怎么办 新买的手机实体店不给换怎么办 苹果平板充电时显示不在充电怎么办 苏州驾校考试科目二挂了两次怎么办 支付宝收款码少收钱了怎么办 支付宝发的红包不领取怎么办 微信存在风险不能领红包怎么办 天猫超市电话写错了怎么办 天猫买东西地址写错了怎么办 天猫上买衣服收货电话写错了怎么办 电视遥控器不小心按了高清键怎么办 康佳电视打开右下角是红色的怎么办 天猫超市退款成功后收到货怎么办 天猫还没收到货就确认收货了怎么办 支付宝红包抵扣被关了怎么办 水貂绒大衣白色过色了怎么办 双面羊绒大衣袖子洗短了怎么办 特殊类型订单销量评价删除后怎么办 淘宝上卖家发货发错了地址怎么办 买完保险想换保险代理人怎么办 怀孕内裤两边磨的好疼怎么办 露肩连体裤穿着卡裆怎么办 魅族手机恋与制作人换诺基亚怎么办 蚊子叮咬后擦风油精了红肿怎么办 机动车已转让没过户出了事情怎么办 签好的合同如果甲方违约怎么办? 饭店没签合同辞职不给工资怎么办 两家为了带孩子闹翻了怎么办啊? 抵押后租赁的房屋被法院拍卖怎么办 房子买20年了没有过户怎么办 二手车没过户行驶证丢了怎么办 买的二手车行驶证丢了怎么办 在京东仓库做事把东西损坏了怎么办 微信显示该账号登陆环境异常怎么办 干洗店把衣服洗坏了怎么办 千牛上怎么改淘宝密码忘记了怎么办 公司收了代理商押金到期不退怎么办 淘宝显示签收但是我没收到货怎么办 淘宝东西没收到显示签收了怎么办 开拼多多店铺的密码忘了怎么办 拼多多密码跟店铺名忘了怎么办