7-4 树的同构 (25分)

    科技2022-08-06  97

    7-4 树的同构 (25分)

    给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。

    图1

    图2

    现给定两棵树,请你判断它们是否是同构的。 输入格式:

    输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。

    输出格式:

    如果两棵树是同构的,输出“Yes”,否则输出“No”。

    输入样例1(对应图1):

    8 A 1 2 B 3 4 C 5 - D - - E 6 - G 7 - F - - H - - 8 G - 4 B 7 6 F - - A 5 1 H - - C 0 - D - - E 2 -

    输出样例1:

    Yes

    输入样例2(对应图2):

    8 B 5 7 F - - A 0 3 C 6 - H - - D - - G 4 - E 1 - 8 D 6 - B 5 - E - - H - - C 0 2 G - 3 F - - A 1 4

    输出样例2:

    No #include<bits/stdc++.h> using namespace std; const int M=100; struct tree{ char element; int left,right; }t1[M],t2[M]; int BulidTree(struct tree t[]){ int root=-1; int n; cin>>n; vector<int> check(n,0); for(int i=0;i<n;i++){ char left,right; cin>>t[i].element>>left>>right; if(left=='-') t[i].left=-1; else{ t[i].left=left-'0'; check[t[i].left]=1; } if(right=='-') t[i].right=-1; else{ t[i].right=right-'0'; check[t[i].right]=1; } } for(int i=0;i<n;i++) if(!check[i]) root=i;//当check[i]==0,i 为根节点的下标; return root; } int Is(int r1,int r2){ if(r1==-1&&r2==-1) return 1;//都为空树则返回1; if((r1!=-1&&r2==-1)||(r1==-1&&r2!=-1)) return 0;//一个是空树,一个不是,返回0; if(t1[r1].element!=t2[r2].element) return 0;//节点上的元素不相同返回0; return Is(t1[r1].left,t2[r2].left)&&Is(t1[r1].right,t2[r2].right)||Is(t1[r1].left,t2[r2].right)&&Is(t1[r1].right,t2[r2].left); //判断两棵树的左子树与右子树是否相同或镜像; } int main() { int a,b; a=BulidTree(t1); b=BulidTree(t2); Is(a,b)?cout<<"Yes":cout<<"No";//从根节点开始判断两棵树是否同构; putchar(10); return 0; }
    Processed: 0.011, SQL: 8