【剑指Offer面试编程题】题目1520:树的子结构--九度OJ
- 题目描述:
-
输入两颗二叉树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
【解题思路】一看到树,第一想法就是递归,虽然递归的效率确实不高,但在OJ上讲究时间效率,有时候配合适当的剪枝能快速AC。本题需要两层递归,首先我们要确定A树的哪个子树与B树进行比照,也就是确定A树的子节点,这是第一层递归;另外,在比较的时候我们也需要用到树的递归,对每一个节点进行比较。两层递归的顺序都是树的先序遍历的顺序。
中间有一点点小技巧,在第一层递归时,我们要在确定B树为子树的时候果断停止递归,避免过多的迭代。
AC code:
#include <cstdio>
#include <vector>
using namespace std; struct st
{
int val;
st *lc;
st *rc;
};
bool flg=false,reflg=false; void check(st *s1,st*s2)
{
if(s1->val!=s2->val)
{
flg=true;
return ;
}
if(s2->lc==NULL && s2->rc==NULL)
return ;
if(s1->lc!=NULL && s2->lc!=NULL)
check(s1->lc,s2->lc);
else if(s1->rc!=NULL && s2->rc!=NULL)
check(s1->rc,s2->rc);
else
{
flg=true;
return ;
}
} void fill(vector<st> &veca,const int&n)
{
st ss;
ss.val=0;
ss.lc=ss.rc=NULL;
veca.push_back(ss);
for(int i=0;i<n;++i)
{
scanf("%d",&ss.val);
veca.push_back(ss);
}
for(int i=1;i<=n;++i)
{
int k,tt;
scanf("%d",&k);
for(int j=0;j<k;++j)
{
scanf("%d",&tt);
if(j==0)
veca[i].lc=&veca[tt];
else
veca[i].rc=&veca[tt];
}
}
} void chk(st *st1,st *st2)
{
if(st1==NULL)
return;
flg=false;
check(st1,st2);
if (!flg) return;
if(st1->lc && flg)
chk(st1->lc,st2);
if(st1->rc && flg)
chk(st1->rc,st2);
} int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
vector<st> veca,vecb;
fill(veca,n);
fill(vecb,m);
st* st1=&veca[1],*st2=&vecb[1];
flg=false;
if(!st2)flg=false;
else chk(st1,st2);
if(flg)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
/**************************************************************
Problem: 1520
User: huo_yao
Language: C++
Result: Accepted
Time:10 ms
Memory:1024 kb
****************************************************************/
题目链接:http://ac.jobdu.com/problem.php?pid=1520
九度-剑指Offer习题全套答案下载:http://download.csdn.net/detail/huoyaotl123/8276299
【剑指Offer面试编程题】题目1520:树的子结构--九度OJ的更多相关文章
- 【剑指Offer面试编程题】题目1362:左旋转字符串--九度OJ
题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=&qu ...
- 【剑指Offer面试编程题】题目1361:翻转单词顺序--九度OJ
题目描述: JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,&quo ...
- 【剑指Offer面试编程题】题目1373:整数中1出现的次数--九度OJ
题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他.问题是:求出1~13的整数中1出现的次数,并算出100~130 ...
- 【剑指Offer面试编程题】题目1509:树中两个结点的最低公共祖先--九度OJ
题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数 ...
- 【剑指Offer面试编程题】题目1508:把字符串转换成整数--九度OJ
题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n&l ...
- 【剑指Offer面试编程题】题目1507:不用加减乘除做加法--九度OJ
题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为两个整数m和n(1<=m,n<=10 ...
- 【剑指Offer面试编程题】题目1506:求1+2+3+...+n--九度OJ
题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 输入: 输入可能包含多个测试样例. 对于每个 ...
- 【剑指Offer面试编程题】题目1356:孩子们的游戏(圆圈中最后剩下的数)--九度OJ
题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为JOBDU的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈. ...
- 【剑指Offer面试编程题】题目1355:扑克牌顺子--九度OJ
题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他 ...
随机推荐
- http的长连接和短连接(史上最通俗!)
1.以前的误解 很久之前就听说过长连接的说法,而且还知道HTTP1.0协议不支持长连接,从HTTP1.1协议以后,连接默认都是长连接.但终究觉得对于长连接一直懵懵懂懂的,有种抓不到关键点的感觉. 今天 ...
- buuctf——facebook1
分为注册和登陆两个页面 据大佬wp登陆页面又盲注,但我没测试 直接注册后登陆 注册后发现,会显示输入的url 根据目录扫描,发现robots.txt和flag.php robots.txt有源码备份 ...
- 卸载mysql时,提示libmysqlclient.so.16()(64bit) is needed by (installed) postfix
卸载时,提示错误,用这个命令就可以rpm -e --nodeps mysql-libs-5.1.73-5.el6_6.x86_64(这个是自己要卸载的版本) [root@unaryhost dev]# ...
- 洛谷P2142 高精度减法 题解
想找原题请点击这里:传送门 原题: 题目描述 高精度减法 输入格式 两个整数a,b(第二个可能比第一个大) 输出格式 结果(是负数要输出负号) 输入输出样例 输入 复制 输出 复制 说明/提示 %数据 ...
- JAVAWeb问题总结(持续更新)
1.在JSP页面头部,出现如下错误: 错误文本: Multiple annotations found at this line: - The superclass "javax.servl ...
- FTP-Publisher Plugin
使用 FTP-Publisher Plugin 在 http://wiki.hudson-ci.org/display/HUDSON/FTP-Publisher+Plugin 有详细说明, 需要注意的 ...
- 使用 Sandcastle Help File Builder 制作文档
1.下载安装 Sandcastle 程序. http://download-codeplex.sec.s-msft.com/Download/Release?ProjectName=shfb& ...
- 「NOI2009」植物大战僵尸
「NOI2009」植物大战僵尸 传送门 这是一道经典的最大权闭合子图问题,可以用最小割解决(不会的可以先自学一下) 具体来说,对于这道题,我们对于两个位置的植物 \(i\) 和 \(j\) ,如果 \ ...
- javascript对象创建及继承
//****************************************************************************** //创建类的多种方式 //------ ...
- 利用DFS算出有多少个连通图
以下面一个题目为例,[题目链接]: https://www.luogu.com.cn/problem/P4961 题目中涉及求出八联通图的个数,这里给出这步的代码: memset(vis, 0, si ...