题目1520:树的子结构
来源:互联网 发布:淘宝属于兴奋剂 编辑:程序博客网 时间:2024/05/22 12:49
- 题目描述:
输入两颗二叉树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 38 8 7 9 2 4 72 2 32 4 5002 6 7008 9 22 2 3001 12030
- 样例输出:
YESNO
- 提示:
B为空树时不是任何树的子树。
/*先根据提题意,建立二叉树,先序遍历,最后用kmp进行匹配*/
#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAX 1002typedef struct node {int data ;struct node *left , *right ;}node , *tree ;int sa[MAX] ,ka , sb[MAX] , kb = 0 ,next[MAX];void Init(tree A[]){for(int i = 1 ; i <MAX ; i ++)A[i] = NULL ;return ;}void Inorder(tree T){if(T){sa[ka++] = T->data;Inorder(T->left);Inorder(T->right);}}void Inorder1(tree T){if(T){sb[kb++] = T->data;Inorder1(T->left);Inorder1(T->right);}}void pre_next(int k ){int i =0 , j = - 1 ;next[0] = -1 ;while(i<k){if( j == -1 || sa[i] == sb[j]){j++;i++ ;next[i] = j ;}elsej = next[j] ;}}bool KMP(){int i = 0 , j = 0 ;int lena = ka ;int lenb = kb ;while( i <= lena){if(sa[i]== sb[j]){i++;j++;}else{if(next[j] == - 1){j = 0 ; i++;}elsej= next[j] ;}if(j== lenb)return true;}return false; }int main(void){int n , m ;while(scanf("%d %d",&n,&m)!=EOF){int i ; tree A[MAX] , B[MAX] ;Init(A);Init(B) ;for( i = 1 ; i <= n ; i++){int cnt ;scanf("%d",&cnt);tree p ;p = (node *)malloc(sizeof(node)) ;p->data = cnt ;p->left = p->right = NULL ;A[i] = p ;}int num , l , r ;for( i = 1 ; i <= n ; i ++){scanf("%d",&num);switch(num){case 2:{scanf("%d %d",&l,&r);A[i]->left = A[l] ;A[i]->right = A[r] ;break; }case 1:{scanf("%d",&l) ;A[i]->left = A[l] ;break; }case 0:{break; }}}int cnt ;for( i = 1 ; i <= m ; i++){scanf("%d",&cnt);tree p ;p = (node *)malloc(sizeof(node)) ;p->data = cnt ;p->left = p->right = NULL ;B[i] = p ;}for( i = 1 ; i <= m ; i ++){scanf("%d",&num);switch(num){case 2:{scanf("%d %d",&l,&r);B[i]->left = B[l] ;B[i]->right = B[r] ;break; }case 1:{scanf("%d",&l) ;B[i]->left = B[l] ;break; }case 0:break;}}ka = kb = 0 ;Inorder(A[1]);Inorder1(B[1] );pre_next(kb ) ;if(KMP())printf("YES\n");elseprintf("NO\n");}return 0;}
- 题目1520:树的子结构
- 题目1520:树的子结构
- 题目1520:树的子结构
- 题目1520:树的子结构
- 题目1520:树的子结构
- 题目1520:树的子结构-九度
- 九度 题目1520:树的子结构
- 九度OJ-题目1520:树的子结构
- 剑指Offer题目1520:树的子结构
- 题目18:树的子结构
- 算法题目-树的子结构
- 算法题目---树的子结构
- 【编程题目】Pq.11--树的子结构
- 【剑指Offer面试编程题】题目1520:树的子结构--九度OJ
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- hibernate 通用分页,查询分页的泛型类
- SQLServer 2008 R2导出的SQL文件中没有数据
- 大数据时代的机器学习热点——国际机器学习大会ICML2013参会感想
- Lua程序设计第二版(笔记) 第二章类型与值
- spatial spyrimad matching
- 题目1520:树的子结构
- SIP注册过程分析
- Handler机制浅析及Message的异步加载
- 编程: 第1个人10,第2个比第1个人大2岁,依次递推,请用递归方式计算出第8个人多大?
- 数据转移
- 将某个目录下的文件复制到相应的目录下
- 交换技术
- C 中float分析
- PHP实现增删改查(基础版)