您的位置:首页 > 其它

树的同构

2016-03-12 14:26 302 查看
#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: