7-4 树的同构 (25分)

原题链接
首先要明白题目中的同构是什么意思?简单来说就是每个节点有相同的孩子,或者是说每个节点有相同的parent。这里只说第一种判定的代码。
易错点
①n有可能为零,所以有可能整棵树为空要判定。

int flag[20];///用来找根节点
struct Node
{
   int l, r;char e;
}node1[20], node2[20];

int buildtree(struct Node *node)
{
   memset(flag,0,sizeof(flag));
   int n, root = -1;
   cin>>n;getchar();

   if(!n)return -1;

   for(int i = 0;i < n;i++)
   {
      string s;
      getline(cin,s);

      node[i].e = s[0];

      if(s[2] == '-')
         node[i].l = -1;
      else
         node[i].l = s[2]-'0';

      if(s[4] == '-')
         node[i].r = -1;
      else
         node[i].r = s[4]-'0';

      if(s[2] != '-')
         flag[s[2]-'0'] = 1;
      if(s[4] != '-')
         flag[s[4]-'0'] = 1;

   }
   for(int i = 0;i < n;i++)
      if(!flag[i])
      {
         root = i;
         break;//没被标记过的就是根节点
      }
   return root;
}
bool judge_(int r1, int r2)
{
   if(r1 == -1&&r2 == -1)///本节点为空
      return 1;
   if((r1 == -1&&r2 != -1)||(r1 != -1&&r2 == -1))///一个为空另一个不为
      return 0;
   if(node1[r1].e != node2[r2].e)///本身元素都不相同
      return 0;///边界条件和判定
(judge_(node1[r1].l,node2[r2].l)&&judge_(node1[r1].r,node2[r2].r)||judge_(node1[r1].l,node2[r2].r)&&judge_(node1[r1].r,node2[r2].l));
}///这时两种情况 
///A树左子树与B树左子树同构且A树右子树与B树右子树同构
///A树左子树与B树右子树同构且A树右子树与B树左子树同构
int main()
{
   int r1, r2;
   r1 = buildtree(node1);
   r2 = buildtree(node2);
   if(judge_(r1, r2))
      cout << "Yes";
   else
      cout <<"No";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值