03-树1 树的同构
2016-04-03 21:16
337 查看
03-树1 树的同构 (25分)
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。
图1
图2
现给定两棵树,请你判断它们是否是同构的。
输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数NN (\le
10≤10),即该树的结点数(此时假设结点从0到N-1N−1编号);随后NN行,第ii行对应编号第ii个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。
如果两棵树是同构的,输出“Yes”,否则输出“No”。
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。
图1
图2
现给定两棵树,请你判断它们是否是同构的。
输入格式:
输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数NN (\le10≤10),即该树的结点数(此时假设结点从0到N-1N−1编号);随后NN行,第ii行对应编号第ii个结点,给出该结点中存储的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 <iostream> #include <stack> #define N 10 using namespace std; typedef struct node { char Ch; int Left; int Right; } NODE; void readData(NODE Node[],int &head) { char ch; int n,i,lf,rt,top; int hS = {0}; stack<int> st; cin>>n; for (i=0; i<n; i++) { cin>>Node[i].Ch; cin>>ch; Node[i].Left = (ch=='-')? -1:(ch-'0'); if (Node[i].Left !=-1) { hS[Node[i].Left ]=1; } cin>>ch; Node[i].Right = (ch=='-')? -1:(ch-'0'); if (Node[i].Right !=-1) { hS[Node[i].Right ]=1; } } for (i=0; i<n; i++) { if (hS[i]==0) { head=i; break; } } } bool cmp(NODE NodeA[],NODE NodeB[],int headA,int headB) { stack<int >A; stack<int >B; int topA,alf,art; int topB,blf,brt; if (headA==-1&&headB==-1) { return true; } else if ((headA==-1&&headB!=-1)||(headA!=-1&&headB==-1)) { return false; } A.push(headA); B.push(headB); while(!A.empty()&&!B.empty()) { topA= A.top(); topB= B.top(); //cout<<NodeA[topA].Ch<<" "<<NodeB[topB].Ch<<endl; if (NodeA[topA].Ch!=NodeB[topB].Ch) { return false; } A.pop(); B.pop(); alf=NodeA[topA].Left; art=NodeA[topA].Right; blf=NodeB[topB].Left; brt=NodeB[topB].Right; if (alf!=-1&&art!=-1) { if (NodeA[alf].Ch>NodeA[art].Ch) { A.push(alf); A.push(art); } else { A.push(art); A.push(alf); } } else if (alf!=-1) { A.push(alf); } else if (art!=-1) { A.push(art); } if (blf!=-1&&brt!=-1) { if (NodeB[blf].Ch>NodeB[brt].Ch) { B.push(blf); B.push(brt); } else { B.push(brt); B.push(blf); } } else if (blf!=-1) { B.push(blf); } else if (brt!=-1) { B.push(brt); } } return true; } int main() { NODE NodeA ; NODE NodeB ; int n,i,headA=-1,headB=-1; readData(NodeA,headA); readData(NodeB,headB); if (cmp(NodeA,NodeB,headA,headB)==true) { cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } return 0; }
相关文章推荐
- libdvbpsi源码分析(四)PAT表解析/重建
- PAT配置
- 什么是端口复用动态地址转换(PAT) 介绍配置实例
- MikroTik layer7-protocol
- PAT是如何工作的
- PAT 乙级题:1002. 写出这个数 (20)
- PAT (Advanced Level) Practise 1001-1010
- 数据结构学习与实验指导(一)
- PAT Basic Level 1001-1010解题报告
- 1001. 害死人不偿命的(3n+1)猜想
- 1002. 写出这个数
- 1032. 挖掘机技术哪家强
- 1001. 害死人不偿命的(3n+1)猜想 (PAT basic)
- 1002. 写出这个数(PAT Basic)
- 1004. 成绩排名(PAT Basic)
- 1006. 换个格式输出整数(PAT Basic)
- 1007. 素数对猜想(PAT Basic)
- 1008. 数组元素循环右移问题
- 1009. 说反话(PAT Basic)
- 1011. A+B和C(PAT Basic)