#include <iostream>
#include <vector>
using namespace std;
typedef struct TreeNode{
char data;
struct TreeNode * left;
struct TreeNode * right;
struct TreeNode * parent;
//用指针来模拟链表结构
}*BinTree;
vector<TreeNode> creatTree(int n){
vector<TreeNode> tree(n);
char data,left,right;
for(int i=0;i<n;i++){
cin>>data>>left>>right;
tree[i].data = data;
if(left !='-'){
tree[i].left = &tree[left-'0'];
tree[(left-'0')].parent = &tree[i];
}
if(right !='-'){
tree[i].right = &tree[right-'0'];
tree[(right-'0')].parent = &tree[i];
}
}
for(int i = 0;i<n;i++){
if(tree[i].parent)
continue;
tree[i].parent =NULL;
} //将数的根节点的parent初始化为NULL ,比较规范
return tree;
}
bool isMorphic(vector<TreeNode> v1, int n, vector<TreeNode> v2, int m){
if(n!=m) return false;
bool flag = true;
for(int i=0;i<n;i++){
flag = false;
for(int j=0;j<m;j++){
if(v1[i].data == v2[j].data){
flag = true;
if(v1[i].parent && v2[j].parent){
if(v1[i].parent->data!= v2[j].parent->data)
return false;
break;
}
else{
if(v1[i].parent == NULL && v2[j].parent == NULL)//同为根节点的时候是正确的 可以进行下一个节点的遍历
break;
else //其中只有一个是根节点的话 一定是不同结构的
return false;
}
}
if(j == m-1 && flag == false) //只要有一个节点找不到与之匹配的 都是不同结构 不用再继续循环
return false;
}
}
return flag;
}
int main()
{
int n,m;
cin>>n;
vector<TreeNode> v1 = creatTree(n);
cin>>m;
vector<TreeNode> v2 = creatTree(m);
if(isMorphic(v1,n,v2,m))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
system("pause");
return 0;
}
树的同构
最新推荐文章于 2022-04-24 13:35:26 发布