剑指OFFER之树的子结构
- 题目描述:
-
输入两颗二叉树A,B,判断B是不是A的子结构。
- 输入:
-
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行一个整数n,m(1<=n<=1000,1<=m<=1000):n代表将要输入的二叉树A的节点个数(节点从1开始计数),m代表将要输入的二叉树B的节点个数(节点从1开始计数)。接下来一行有n个数,每个数代表A树中第i个元素的数值,接下来有n行,第一个数Ki代表第i个节点的子孩子个数,接下来有Ki个树,代表节点i子孩子节点标号。接下来m+1行,与树A描述相同。
- 输出:
-
对应每个测试案例,
若B是A的子树输出”YES”(不包含引号)。否则,输出“NO”(不包含引号)。
- 样例输入:
-
7 3 8 8 7 9 2 4 7 2 2 3 2 4 5 0 0 2 6 7 0 0 8 9 2 2 2 3 0 0 1 1 2 0 3 0
- 样例输出:
-
YES NO
- 提示:
-
B为空树时不是任何树的子树。
Code:
#include <cstdio> using namespace std; struct BinaryTreeNode{ int data; int lchild; int rchild; }; bool DoesTree1HaveTree2(BinaryTreeNode *arr1,int root1,BinaryTreeNode *arr2,int root2){ if(root2==0) return true; if(root1==0) return false; if(arr1[root1].data!=arr2[root2].data) return false; return DoesTree1HaveTree2(arr1,arr1[root1].lchild,arr2,arr2[root2].lchild)&&
DoesTree1HaveTree2(arr1,arr1[root1].rchild,arr2,arr2[root2].rchild); } bool HasSubtree(BinaryTreeNode *arr1,int root1,BinaryTreeNode *arr2,int root2){ bool result=false; if(root1!=0&&root2!=0){ if(arr1[root1].data==arr2[root2].data){ result=DoesTree1HaveTree2(arr1,root1,arr2,root2); } if(!result){ result=HasSubtree(arr1,arr1[root1].lchild,arr2,root2); } if(!result){ result=HasSubtree(arr1,arr1[root1].rchild,arr2,root2); } } return result; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF){ BinaryTreeNode arr1[1010],arr2[1010]; for(int index1=1;index1<=n;++index1){ scanf("%d",&arr1[index1].data); } for(int cnt1=1;cnt1<=n;++cnt1){ int numberOfChild; scanf("%d",&numberOfChild); if(numberOfChild==2){ scanf("%d%d",&arr1[cnt1].lchild,&arr1[cnt1].rchild); }else{ if(numberOfChild==1){ scanf("%d",&arr1[cnt1].lchild); arr1[cnt1].rchild=0; }else{ arr1[cnt1].lchild=arr1[cnt1].rchild=0; } } } for(int index2=1;index2<=m;++index2){ scanf("%d",&arr2[index2].data); } for(int cnt2=1;cnt2<=m;++cnt2){ int numberOfChild; scanf("%d",&numberOfChild); if(numberOfChild==2){ scanf("%d%d",&arr2[cnt2].lchild,&arr2[cnt2].rchild); }else{ if(numberOfChild==1){ scanf("%d",&arr2[cnt2].lchild); arr2[cnt2].rchild=0; }else{ arr2[cnt2].lchild=arr2[cnt2].rchild=0; } } } if(n==0||m==0||n<m){ printf("NO\n"); continue; } bool ans=HasSubtree(arr1,1,arr2,1); if(ans==true) printf("YES\n"); else printf("NO\n"); } return 0; } /************************************************************** Problem: 1520 User: lcyvino Language: C++ Result: Accepted Time:10 ms Memory:1020 kb ****************************************************************/