参考这篇文章写的代码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,为啥会犯这样的错误呢?
}