题目1520:树的子结构

来源:互联网 发布:linux 目录空间查看 编辑:程序博客网 时间:2024/06/11 02:40

找B的跟节点和A的跟节点一样的点,在遍历左右子树,如果都相同则返回true,否则继续寻找

#include<cstdio>#include<cstring>typedef struct node {int val;struct node *left;struct node *right;void setVal(int v){this->val = v;left = right = NULL;}}Tree;int n,m;void createTree(int n,Tree tree[]){int val,childIndex;if(n == 0)return;for(int i=0;i<n;++i){scanf("%d",&val);tree[i].setVal(val);}for(int i=0;i<n;++i){scanf("%d",&val);if(val == 1){scanf("%d",&childIndex);tree[i].left = &tree[childIndex-1];}else if(val == 2){scanf("%d",&childIndex);tree[i].left = &tree[childIndex-1];scanf("%d",&childIndex);tree[i].right = &tree[childIndex-1];}}}bool isSubTree(Tree *aTree,Tree*bTree){if(bTree == NULL)return true;if(aTree == NULL)return false;if(aTree->val != bTree->val)return false;return isSubTree(aTree->left,bTree->left) && isSubTree(aTree->right,bTree->right);}bool checkSubTree(Tree *aTree,Tree *bTree){bool is = false;if(aTree != NULL && bTree != NULL){if(aTree->val == bTree->val){ is = isSubTree(aTree,bTree);}if(!is && aTree->left != NULL){is = checkSubTree(aTree->left,bTree);}if(!is && aTree->right != NULL){is = checkSubTree(aTree->right,bTree);}}return is;} int main(){while(scanf("%d%d",&n,&m) != EOF){Tree aTree[1009],bTree[1009];createTree(n,aTree);createTree(m,bTree);if(n <= 0 || m <= 0){printf("NO\n");continue;}if(checkSubTree(aTree,bTree)){printf("YES\n");}else{printf("NO\n");}}return 0;} 


0 0