您的位置:首页 > 理论基础 > 数据结构算法

数据结构PTA第三周作业1:树的同构

2019-04-20 21:47 169 查看
4000

带讲解的原题,按照讲的思路写完程序出现了段错误,为此看了一篇相关的博客依然解决不了问题。

C/C++中的段错误:https://www.geek-share.com/detail/2549443820.html

后来看了别人的做法:

Debug1:改了数组checkroot的定义方式,通过的测试点由2个变成3个

Debug2:改了输入的字符串格式,\n改到了行首,就全部正确了

再把checkroot的定义方式改回原来的写法,还是全部通过(为什么一开始改就可以多增一个通过点?)

 

[code]#include<stdio.h>

struct TreeNode{
char Element;
int tl;
int tr;
}T1[100],T2[100];

int BuildTree(struct TreeNode T[]);
int Isomorphic(int r1, int r2);

int main()
{
int r1,r2; //根节点标号
r1 = BuildTree(T1);
r2 = BuildTree(T2);
if(Isomorphic(r1,r2)){
printf("Yes\n");
}else{
printf("No\n");
}
return 0;
}

int BuildTree(struct TreeNode T[])
{
int N, Root=-1;
scanf("%d",&N); //读入树的节点个数

if(N){
//int* checkroot = (int*)malloc(sizeof(int)*N); //Debug1:2个正确->3个正确
int checkroot
;
for(int i=0; i<N; i++) {checkroot[i]=0;}
char l, r;

for(int i=0; i<N; i++){
scanf("\n%c %c %c",&T[i].Element, &l, &r); //输入修改,全部正确

if(l!='-'){
T[i].tl = l - '0';
checkroot[T[i].tl] = 1; //这个标号的节点被别的节点指到过,不是根节点,标志位置1
}
else{
T[i].tl = -1;
}

if(r!='-'){
T[i].tr = r - '0';
checkroot[T[i].tr] = 1; //这个标号的节点被别的节点指到过,不是根节点,标志位置1
}
else{
T[i].tr = -1;
}
}
for(int i=0; i<N; i++){
if(checkroot[i]==0) {Root=i;break;}
}
}
return Root;
}

int Isomorphic(int r1, int r2)
{
if(r1==-1 && r2==-1) //两棵树均为空
{return 1;}
if((r1==-1 && r2!=-1)||(r1!=-1 && r2==-1))
{return 0;}
if(T1[r1].Element!=T2[r2].Element)
{return 0;}
if(T1[r1].tl==-1 && T2[r2].tl==-1)
{return Isomorphic(T1[r1].tr, T2[r2].tr);}
if((T1[r1].tl!=-1)&&(T2[r2].tl!=-1)&&(T1[T1[r1].tl].Element == T2[T2[r2].tl].Element))
{return Isomorphic(T1[r1].tl, T2[r2].tl) && Isomorphic(T1[r1].tr, T2[r2].tr); }
else
{return Isomorphic(T1[r1].tl, T2[r2].tr) && Isomorphic(T1[r1].tr, T2[r2].tl); }
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: