树的同构

来源:互联网 发布:期货软件大赢家 编辑:程序博客网 时间:2024/05/16 02:02
#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;elsecout<<"No"<<endl;system("pause");return 0;}

0 0
原创粉丝点击