第一颗红豆 2020-09-01 20:41 采纳率: 50%
浏览 91

pat 树的同构 判断两棵树是否同构

如题 判断两棵树是同构的

自己的方法怎么也想不通哪里的错误

o(╥﹏╥)o

图片说明

#include <iostream>
using namespace std;
#define elementtype char
#define  tree int
#define null -1
#define maxsize 10
struct treenode{
    elementtype element;
    tree left;
    tree right;
}T1[maxsize],T2[maxsize];
tree maketree(struct treenode T[]);
tree judge(tree R1,tree R2);
int check[maxsize],N;

int main(){
    tree R1,R2;
    R1=maketree(T1);
    R2=maketree(T2); 
    if(judge(R1,R2)) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    return 0;
}
tree maketree(struct treenode T[]){ //建树并且返回根节点 
    int i;
    tree root=null;
    char cl,cr;
    cin>>N;
    if(N){
         for(i=0;i<N;i++) check[i]=0;//check 数组用来记录各个节点是否已经被指向过,没有则为0 
         for(i=0;i<N;i++){
            cin>>T[i].element>>cl>>cr;//初始化数组 
            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(i=0;i<N;i++)//{
            if(!check[i]) break;            //如果给出的数据是两棵树 bug  以前者的那个根为树的根 后者被忽略 
            root=i;
    //  }   不能加括号 加了括号break直接跳出 不在进行root=i 
    }
    return root;
}


//这是正确的做法
/*tree judge(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 judge(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))//都有左节点1.左节点数据相同 
        return (judge(T1[R1].left,T2[R2].left)&&judge(T1[R1].right,T2[R2].right));          //向左递归 
        else            //其他 左节点不一定都有 左节点数据不一定相同 
            return (judge(T1[R1].left,T2[R2].right)&&judge(T1[R1].right,T2[R2].left));
}*/



//我写的
tree judge(tree R1,tree R2){//判断两棵树是否为同一颗树
    if ((R1==null&&R2==null)||(R1!=null&&R2!=null&&T1[R1].element ==T2[R2].element )) return 1; 
        else return 0;          //都空 都存在且数据相同 
    if (T1[R1].left!=null&&T2[R2].left!=null&&T1[R1].left ==T2[R2].left ) //左树的左子比较右树的左右子
    return (judge(T1[R1].left ,T2[R2].left ))&&(judge(T1[R1].right ,T2[R2].right ));//&&(judge(T1[R1].right ,T2[R2].right ))
        else if(T1[R1].left!=null&&T2[R2].right !=null&&T1[R1].left ==T2[R2].right )
                return (judge(T1[R1].left,T2[R2].right  ))&&(judge(T1[R1].right ,T2[R2].left ));//&&(judge(T1[R1].right ,T2[R2].left ))
        else return 0;
    if (T1[R1].right!=null&&T2[R2].left!=null&&T1[R1].right ==T2[R2].left )//左树的右子比较右树的左右子 
        return (judge(T1[R1].right ,T2[R2].left ))&&(judge(T1[R1].left ,T2[R2].right ));//&&(judge(T1[R1].left ,T2[R2].right ))
        else if(T1[R1].right!=null&&T2[R2].right!=null&&T1[R1].right ==T2[R2].right )
                return (judge(T1[R1].right,T2[R2].right  ))&&(judge(T1[R1].left ,T2[R2].left ));//&&(judge(T1[R1].left ,T2[R2].left ))
                else return 0;
}


  • 写回答

1条回答 默认 最新

  • dabocaiqq 2020-09-02 09:38
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办