(结构数组表示二叉树)树的同构
2018-02-02 19:34
288 查看
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。
图1
图2现给定两棵树,请你判断它们是否是同构的。
图1
图2现给定两棵树,请你判断它们是否是同构的。
输入格式:
输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤),即该树的结点数(此时假设结点从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 <iostream> using namespace std; #define null -1 //表示空的位置,传统空指针NULL在stdio.h中的值为0,而这里有下标为0的地方,为了区分传统意义上的空指针,所以宏定义了一个 struct TreeNode{ char ch; int left,right; //指向左右孩子位置的下标 }T1[10],T2[10]; //结构数组 int createTree(struct TreeNode T[],int n) { int chick[10],root; char left,right; if(n) { for(int i=0;i<n;i++) chick[i]=0;//0表示i位置上无父节点,1表示i位置上有父节点 for(int i=0;i<n;i++) { cin>>T[i].ch>>left>>right; if(left!='-') { T[i].left=left-'0'; chick[T[i].left]=1; }else T[i].left=-1; if(right!='-') { T[i].right=right-'0'; chick[T[i].right]=1; }else T[i].right=-1; } for(int i=0;i<n;i++) { if(chick[i]==0)//没父节点的就是根 { root=i; break; } } } else root=-1; return root; } int isomorphic(int root1,int root2) { if(root1==null&&root2==null) return 1; if((root1!=null&&root2!=null)) if(T1[root1].ch==T2[root2].ch) if(isomorphic(T1[root1].left,T2[root2].left)&&isomorphic(T1[root1].right,T2[root2].right)||isomorphic(T1[root1].left,T2[root2].right)&&isomorphic(T1[root1].right,T2[root2].left)) return 1; return 0; } int main() { int n; while(cin>>n) { int root1,root2; root1=createTree(T1,n); cin>>n; root2=createTree(T2,n); if(isomorphic(root1,root2)) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
相关文章推荐
- 6.33③ 假定用两个一维数组L[1..n]和R[1..n]作为 有n个结点的二叉树的存储结构, L[i]和R[i]分别指 示结点i的左孩子和右孩子,0表示空。试写一个算法 判别结点u是否为结点v的
- 二叉树结构数组表示法
- 二叉树的树状数组和双向列表有区别,一个是针对明显的树状结构,一个是可以用来表示树状结构,Uva122
- (结构数组表示二叉树+堆+二叉排序树)笛卡尔树
- 图的存储结构(1):数组表示法
- 二叉树链表结构表示法
- 数组的顺序结构表示和实现
- 数据结构(严蔚敏)二叉树的二叉链表存储表示
- 图的存储结构(1):数组表示法
- 二叉树的数组表示 C++实现(添加 按层遍历)
- 二叉树采用二叉链表结构表示。设计并实现如下算法:后序递归建树,先序非递归遍历该树。
- 数据结构实验之二叉树一:树的同构
- 图(网)的存储结构(数组存储表示即邻接矩阵、邻接表)
- uva122 数组表示二叉树,bfs
- 结构体内的数组用指针表示的时候要注意指针溢出造成不必要的bug
- HashMap集合源码以及底层结构解析(何时数组+单项链表变为数组+红黑二叉树)
- 二叉树采用二叉链表结构表示。设计并实现如下算法:输入某棵二叉树的广义表形式,建立该二叉树,并按层次遍历该二叉树。
- 数据结构之 队列 链表表示与数组表示
- 二叉树数组存储结构实现
- 数据结构实验之二叉树一:树的同构