03-树1 树的同构

题目

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

思路

建树A,B、对A每一个树结点,在树B中找到相应结点,比较其左右儿子是否相同
注意C语言char类型数据的输入

代码
typedef struct TreeNode*BinTree;
struct TreeNode{    
    char data;    
    int left;    
    int right;
};
void createTree(int N,struct TreeNode T[]){    
    char alpha;    
    char cl,cr;
    int flag=0;        
    for(int i=0;i<N;i++){        
        if(flag==1) scanf("\n");
        else flag=1;        
        scanf("%c %c %c",&alpha,&cl,&cr);        
        T[i].data=alpha;        
        if(cl=='-')  T[i].left=-1;        
        else  T[i].left=cl-'0';        
        if(cr=='-')  T[i].right=-1;  
        else  T[i].right=cr-'0';      
     }     
} 
int search(struct TreeNode T[],char alpha,int N){    
    for(int i=0;i<N;i++){        
        if(T[i].data==alpha)  return i;}
    return -1;/*没找到*/
}
int main()
{
   int flag;    
   int N;     
   scanf("%d",&N);     
   if(N==0) flag=1;/*空树*/    
   else {        
      scanf("\n"); //一场\n引发的血案      
      struct TreeNode T1[N];     
      createTree(N,T1);     
      scanf("%d\n",&N);     
      struct TreeNode T2[N];
      createTree(N,T2);
      /*比较*/     
      for(int i=0;i<N;i++){        
         char alpha;        
         char left,right;        
         int _alpha;        
         char _left,_right;                
         alpha=T1[i].data;        
         if(T1[i].left==-1) left='-';        
         else  left=T1[T1[i].left].data;                
         if(T1[i].right==-1) right='-';        
         else right=T1[T1[i].right].data;                
         _alpha=search(T2,alpha,N);        
         if(_alpha!=-1){ //在树2中找到对应点               
            if(T2[t2].left==-1) _left='-';         
            else _left=T2[T2[t2].left].data;         
            if(T2[t2].right==-1) _right='-';         
            else  _right=T2[T2[t2].right].data;                 
            if(((left!=_left)&&(left!=_right))||((right!=_right)&&(right!=_left))){flag=0;break;}         
            else  flag=1; }             
         else flag=0; }    
   }    
   if(flag==0) printf("No");    
   else    printf("Yes");        
   return 0; 
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值