树的同构
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; }
相关文章推荐
- unity视频笔记——ngui-基础
- 基因数据处理6之BWA_MEM无法分配内存
- 解决Linux下inode频繁掉线问题
- 关于Web API的个人理解
- python-Day7
- jquery.validate.unobtrusive的使用
- 堆栈之静态数组
- stl_set
- Missing iOS Distribution signing identity证书失效问题
- Swift 基础学习(内存管理)
- jquery中的几个问题总结
- 构建执法阅读笔记01
- 学习进度条——第二周
- 单调队列——滑动窗口
- Win32控制台程序中使用STL(string)
- C#扩展方法的理解 (转)
- 数据库使用情景分析
- Eclipse 下载 Git 仓库中代码(github上)
- 迅雷云监工(Crysadm)
- 附加理论材料课程笔记