标签:保存 names int main font for 思路 str class
题目 :
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。
图一:
图二:
现给定两棵树,请你判断它们是否是同构的。
输入格式:
输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N?1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。
输出格式:
如果两棵树是同构的,输出“Yes”,否则输出“No”。
思路:
这个题读完题之后,没有建树,而是直接处理的树中每个节点的左孩子与右孩子的信息。
根据题意可以得知只要两棵树上每个节点的左右孩子一样,那么这两棵树就是同构。
所以,根据给出的信息,分别存一下两个树的孩子信息,然后两棵树相同的节点分别进行比较,最后得出结果。
代码:
#include <bits/stdc++.h> #define inf 0x3f3f3f3f #define FRE() freopen("in.txt","r",stdin) using namespace std; typedef long long ll; struct Node { char lchild; char rchild; int idxl; int idxr; char root; bool vis = false; }; Node f1[27],f2[27]; Node tree1[27],tree2[27]; bool judgeSame(Node a,Node b) { bool ok = false; if(a.lchild == b.lchild && a.rchild == b.rchild) { ok = true; } if(a.lchild == b.rchild && a.rchild == b.lchild) { ok = true; } return ok; } bool judge(char op){ if(op>=‘0‘ && op<=‘9‘){ return true; }else{ return false; } } int main() { int n,m; cin>>n; for(int i = 0; i<n; i++) {//存信息 getchar(); char o1,o2; cin>>f1[i].root>>o1>>o2; if(judge(o1)) f1[i].idxl = o1-‘0‘; else f1[i].idxl = -1; if(judge(o2)) f1[i].idxr = o2-‘0‘; else f1[i].idxr = -1; } cin>>m; for(int i = 0; i<m; i++) {//存信息 char o1,o2; getchar(); cin>>f2[i].root>>o1>>o2; if(judge(o1)) f2[i].idxl = o1-‘0‘; else f2[i].idxl = -1; if(judge(o2)) f2[i].idxr = o2-‘0‘; else f2[i].idxr = -1; } for(int i = 0; i<n; i++) {//处理保存第一棵树的孩子信息 int idx = f1[i].root - ‘A‘; int idl = f1[i].idxl; int idr = f1[i].idxr; if(idl>=0) tree1[idx].lchild = f1[idl].root; else tree1[idx].lchild = ‘#‘; if(idr>=0) tree1[idx].rchild = f1[idr].root; else tree1[idx].rchild = ‘#‘; tree1[idx].vis = true; } // for(int i = 0; i<25; i++){ // if(tree1[i].vis) // cout<<‘A‘+i<<" "<<tree1[i].lchild<<" "<<tree1[i].rchild<<endl; // } for(int i = 0; i<m; i++) {//处理保存第二棵树的孩子信息 int idx = f2[i].root - ‘A‘; int idl = f2[i].idxl; int idr = f2[i].idxr; if(idl>=0) tree2[idx].lchild = f2[idl].root; else tree2[idx].lchild = ‘#‘; if(idr>=0) tree2[idx].rchild = f2[idr].root; else tree2[idx].rchild = ‘#‘; tree2[idx].vis = true; } // cout<<endl<<"-----------------------------------------------"<<endl; // for(int i = 0; i<25; i++){ // if(tree2[i].vis) // cout<<" "<<tree2[i].lchild<<" "<<tree2[i].rchild<<endl; // } bool ok = true; for(int i = 0; i<26; i++) {//两棵树的相同的节点分别进行比较 if(!judgeSame(tree1[i],tree2[i])) { ok = false; } } if(ok) { cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } return 0; } /* PutIn: 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 - PutOut: Yes */ /* PutIn: 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 PutOut: No */
标签:保存 names int main font for 思路 str class
原文地址:https://www.cnblogs.com/sykline/p/9965755.html