判断一棵树B是否是A的子树,对A做DFS,然后不断判断是否和B相同。

其实也可以不对A做DFS,直接遍历A中的每个节点和B做树的比较就行了。

#include <iostream>
#include <vector>
using namespace std; bool sameTree(int a, int b, vector<vector<int> > &treeA, vector<vector<int> > &treeB, vector<int> &valA, vector<int> &valB) {
if (valA[a] != valB[b]) return false;
if (treeB[b].size() == 0) return true;
if (treeA[a].size() != treeB[b].size()) return false;
for (int i = 0; i < treeA[a].size(); i++) {
if (!sameTree(treeA[a][i], treeB[b][i], treeA, treeB, valA, valB))
return false;
}
return true;
} bool subTree(vector<vector<int> > &treeA, vector<vector<int> > &treeB, vector<int> &valA, vector<int> &valB, int root) {
if (sameTree(root, 1, treeA, treeB, valA, valB)) {
return true;
}
for (int i = 0; i < treeA[root].size(); i++) {
if (subTree(treeA, treeB, valA, valB, treeA[root][i])) {
return true;
}
}
return false;
} int main() {
int n, m;
while (cin >> n >> m)
{
vector<vector<int> > treeA(n+1);
vector<vector<int> > treeB(m+1);
vector<int> valA(n+1);
vector<int> valB(m+1);
for (int i = 1; i <= n; i++) {
int tmp;
cin >> tmp;
valA[i] = tmp;
}
for (int i = 1; i <= n; i++) {
int cnt;
cin >> cnt;
while (cnt--) {
int x;
cin >> x;
treeA[i].push_back(x);
}
}
for (int i = 1; i <= m; i++) {
int tmp;
cin >> tmp;
valB[i] = tmp;
}
for (int i = 1; i <= m; i++) {
int cnt;
cin >> cnt;
while (cnt--) {
int x;
cin >> x;
treeB[i].push_back(x);
}
} if (m == 0 || n == 0) {
cout << "NO" << endl;
continue;
}
if (subTree(treeA, treeB, valA, valB, 1)) {
cout << "YES" << endl;
}
else {
cout << "NO" << endl;
}
}
}

  

[jobdu]树的子结构的更多相关文章

  1. [Jobdu] 题目1520:树的子结构

    题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构.注:B为空树时不为任何树的子树 typedef struct BTNode{ int key; struct BTNode *rchild; ...

  2. 剑指Offer面试题:17.树的子结构

    一.题目:树的子结构 题目:输入两棵二叉树A和B,判断B是不是A的子结构.例如下图中的两棵二叉树,由于A中有一部分子树的结构和B是一样的,因此B是A的子结构. 该二叉树的节点定义如下,这里使用C#语言 ...

  3. 剑指offer——树的子结构 (JAVA代码)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构). 解题思路: 首先看牛客网给出的测试用例: ...

  4. 剑指Offer 树的子结构

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构)     思路: 分为2个部分.1先找出A中和B根节点相同的节点r. 2,咱判断B中所有孩子节点是不 ...

  5. 《剑指offer》— JavaScript(17)树的子结构

    树的子结构 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 相关知识 二叉树子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取.例 ...

  6. 树的子结构(JAVA)

    树的子结构 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) public boolean HasSubtree(TreeNode root1, T ...

  7. 《剑指offer》 树的子结构

    本题来自<剑指offer> 树的子结构 题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 分两步走: 第一步:判断根节点,两个根节 ...

  8. 剑指offer(17)树的子结构

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目分析 分析如何判断树B是不是树A的子结构,只需要两步.很容易看出来这是一个递归的过程.一般在树 ...

  9. 剑指Offer 17. 树的子结构 (二叉树)

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目地址 https://www.nowcoder.com/practice/6e196c44c7 ...

随机推荐

  1. JAXB - Annotations, Controlling Element Selection: XmlAccessorType, XmlTransient

    If JAXB binds a class to XML, then, by default, all public members will be bound, i.e., public gette ...

  2. 使用VERT.X构建分布式企业级应用

    谈到企业应用,就得谈分布式.低耦合.模块化.面向服务.可扩展性等等.早些时候的技术有CORBA和EJB,后面兴起的有WebService和MDB.但是这些技术不是学习.开发门槛高就是不那么轻量化.我现 ...

  3. Apache优化:修改最大并发连接数

    http://www.365mini.com/page/apache-concurrency-configuration.htm Apache是一个跨平台的web服务器,由于其简单高效.稳定安全的特性 ...

  4. Appium Android 屏幕滑动

  5. ### Theano

    Theano. #@author: gr #@date: 2014-07-02 #@email: forgerui@gmail.com 一.安装Theano ubuntu下安装相对简单. 安装依赖: ...

  6. C语言:Day1~Day4

    点击右键查看原图

  7. 使用jQuery调用ASP.NET WebService的简易教程

    鉴于使用Javascript调用Web Service配置略麻烦,所以记录一下. 1. 新建一个Web服务(WebService.asmx) 2. 取消注释// [System.Web.Script. ...

  8. JavaScript中事件绑定的方法总结

    最近收集了一些关于JavaScript绑定事件的方法,汇总了一下,不全面,但是,希望便于以后自己查看. JavaScript中绑定事件的方法主要有三种: 1 在DOM元素中直接绑定 2 JavaScr ...

  9. vmware以及schlumberger题解

    先是vmare的:具体的题目我就不描述了. 1. 贪吃的小明.直接数个数,统计个数,就可以完成.使用map,应该输入implement这一类,我认为很简单,但是我只过了33%. /* ID: y119 ...

  10. Mustache

    简要介绍 玩过node的人应该都知道ejs,jade. mustache和他们一样都是模板渲染引擎,我个人喜欢mustache,因为他非常简洁,代码量才600多行. mustache既可以在前端使用, ...