慕课浙大数据结构-03-树1 树的同构 (25分)

参考这篇文章写的代码03-树1 树的同构 (25分)
1.C语言中的字符常量是用单引号括起来的一个字符(注意是单引号不是双引号:if(cl!=’-’){ //将单引号错写为双引号会报错。
字符串读取:scanf("%s", string);
字符读取:scanf("%c", &c);(注意这个需要加取地址运算发,但是字符串不需要,因为是字符串数组,string直接是数组名,是首地址,因此不需要再取地址了。
2.在定义数组时不能使用变量定义数组的大小.
初始化数组,int a[3] = {0}; 和 int a[3] = {0,0,0};似乎第一种方式可以自动将后面的元素全赋值为0
3.把ismorphic函数中的if改成else if 也可以运行通过,其实我不太懂,什么时候应该用else if
4.Yes和No错写成了YES和NO,为啥会犯这样的错误呢?找了一个小时才发现(反思一下:我是不是该放弃编程,哭)

#include<stdio.h>
#define Null -1
#define MAXSIZE 10 //不需要加分号
typedef int Tree;
struct TreeNode{
    
    
    char Data;
    Tree Left;
    Tree Right;
}T1[MAXSIZE],T2[MAXSIZE];
int ismorphic(Tree T1,Tree T2);
Tree BuildTree(struct TreeNode T[]);
Tree BuildTree(struct TreeNode T[]){
    
    
    int Root=Null,N; //刚开始将节点置为空,若为空树的时候可返回Null
    char cl,cr;
    scanf("%d",&N);
    if(N){
    
       //加入对树为空的判断
    int check[MAXSIZE]={
    
    0};//置为零
        for(int i=0;i<N;++i){
    
       //把N个节点读入树
            scanf("\n%c %c %c",&T[i].Data,&cl,&cr);//&T[i].Data,&cl,&cr是不是不需要&  蒙圈。回来再做把
            if(cl!='-'){
    
      //将单引号错写为双引号会报错comparison between pointer and integer
                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;
            }
        }
        int i;
        for(i=0;i<N;++i){
    
    
            if(!check[i]) break;        
        }
        Root = i; 
    }
    return Root;    
}

int ismorphic(Tree R1,Tree R2){
    
    
    if(R1==Null && R2==Null) return 1; //不加这么多括号写也可以((R1==Null) && (R2==Null))
    if(((R1==Null) && (R2!=Null))||((R2==Null) && (R1!=Null))) return 0;//把||错写成|
    if(((R1!=Null) && (R2!=Null))&&(T1[R1].Data!=T2[R2].Data)) return 0;
    
    if((R1!=Null) && (R2!=Null)&&(T1[R1].Data==T2[R2].Data)&&(T1[R1].Left==Null)&&(T2[R2].Left==Null))//
        return ismorphic(T1[R1].Right,T2[R2].Right);
    if((R1!=Null)&&(R2!=Null)&&(T1[R1].Data==T2[R2].Data)&&(T1[R1].Left!=Null)&&(T2[R2].Left!=Null)&&(T1[T1[R1].Left].Data==T2[T2[R2].Left].Data)) //(R1!=Null)&& (R2!=Null)&&(T1[R1].Data==T2[R2].Data&& 
        return (ismorphic(T1[R1].Left,T2[R2].Left)&&ismorphic(T1[R1].Right,T2[R2].Right));
    else return(ismorphic(T1[R1].Left,T2[R2].Right) && ismorphic(T1[R1].Right,T2[R2].Left));
    
}
int main(){
    
    
    Tree R1,R2;
    R1 = BuildTree(T1);
    R2 = BuildTree(T2);
    if (ismorphic(R1,R2)) printf("Yes");
    else printf("No"); //错写成了YES和NO,为啥会犯这样的错误呢?
}



猜你喜欢

转载自blog.csdn.net/weixin_43919570/article/details/105102520