MOOC浙江大学のデータ構造-03-ツリー1ツリー同型(25ポイント)

この記事に書かれているコードを参照してください03-ツリー1ツリー同型(25ポイント)1。C
言語の文字定数は、一重引用符で囲まれた文字です(一重引用符は二重引用符ではないことに注意してください:if(cl!= '- '){//一重引用符を間違って書くと、二重引用符はエラーを報告します。
文字列の読み取り:scanf( "%s"、string);
文字の読み取り:scanf( "%c"、&c);(これを追加する必要があることに注意してください。アドレス操作を実行しますが、文字列は文字列配列であるため、文字列は必要ありません。文字列は直接配列の名前であり、最初のアドレスであるため、アドレスを取得する必要はありません
。2。変数は使用できません配列を定義するときに配列のサイズを定義するには。配列を
初期化します。inta[3] = { 0};およびinta [3] = {0,0,0 };最初の実施形態では後者を自動的に割り当てることができるようです。要素はすべて0
です。3。関数が同型です。ifがelseに変更された場合、ifも実行できます。実際、私にはわかりません。elseifをいつ使用する必要がありますか。4。Yes
とNoが誤ってYESとNOと記述されています。なぜ私はそのような間違いをするのですか?私は1時間を探した後に見つけました(反射:プログラミングをあきらめて泣くべきですか)

#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