【剑指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张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他 ...
随机推荐
- 吴裕雄 python 神经网络——TensorFlow 多线程队列操作
import tensorflow as tf queue = tf.FIFOQueue(100,"float") enqueue_op = queue.enqueue([tf.r ...
- MAC系统 -java开发环境搭建
MAC - java开发环境搭建 软件: jdk Intellij IDEA:java开发工具 maven:jar包管理 git :源码管理 sourceTree :源码管理GUI客户端 Studio ...
- 关于java继承条件下的构造方法调用
首先是测试代码: class Grandparent { public Grandparent() { System.out.println("GrandParent Created.&qu ...
- 线程同步 - POSIX互斥锁
线程同步 - POSIX互斥锁 概括 本文讲解POSIX中互斥量的基本用法,从而能达到简单的线程同步.互斥量是一种特殊的变量,它有两种状态:锁定以及解锁.如果互斥量是锁定的,就有一个特定的线程持有或者 ...
- MATLAB的安装与入门
最近安装了MATLAB来用,过程遇到很多问题,担心自己改天如果换电脑了就忘记一些安装问题,所以记录一个. 首先是资源问题,我在贴吧找到了好心人分享的破解资源(非常感谢好心人的资源(ง •_•)ง),然 ...
- Educational Codeforces Round 81 + Gym 102267
UPD:变色了!!!历史最高1618~ Educational Codeforces Round 81 (Rated for Div. 2) The 2019 University of Jordan ...
- leetCode练题——14. Longest Common Prefix
1.题目 14. Longest Common Prefix Write a function to find the longest common prefix string amongst a ...
- liux vim 命令
清除所有行 先 gg 再 dG
- 多Python版本共存
Python 3.4 和 3.7 共存 我的电脑上同时安装了 Python 3.4 和 Python 3.7 两个 Python 版本.现在打开终端窗口进入指定的版本. py -3.4 py -3.7 ...
- FormsAuthentication.HashPasswordForStoringInConfigFile方法再.net core中的替代代码
FormsAuthentication.HashPasswordForStoringInConfigFile()这个加密方法再.net core中不存在了,可以用下面的方式达到一样的加密效果 usin ...