给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。
图1
图2
现给定两棵树,请你判断它们是否是同构的。
输入格式:
输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。
输出格式:
如果两棵树是同构的,输出“Yes”,否则输出“No”。
输入样例1(对应图1):
8A 1 2B 3 4C 5 -D - -E 6 -G 7 -F - -H - -8G - 4B 7 6F - -A 5 1H - -C 0 -D - -E 2 -
输出样例1:
Yes
输入样例2(对应图2):
8B 5 7F - -A 0 3C 6 -H - -D - -G 4 -E 1 -8D 6 -B 5 -E - -H - -C 0 2G - 3F - -A 1 4
输出样例2:
No
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 9 using namespace std;10 #define OK 111 #define Null -112 #define Tree int13 #define ElemType char14 #define MAX 10015 struct TNode16 {17 ElemType data;18 Tree left;19 Tree right;20 } T1[MAX],T2[MAX];//两个数 定义为全局变量21 int Create(struct TNode T[])22 {23 int n;24 int k=-1;//初始化为-1即Null!!!防止空树25 scanf("%d",&n);26 cin.get();27 if(n)28 {29 30 char c,b;31 int check[n];//check用来找树的根,初始时全为0,一共n个结点,0~n-1,对每一个结点,将它的左右儿子对应的check都变为1;然后再遍历check,值为0的那个元素就是树的根。32 for(int i=0; i