判断一棵树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. nopCommerce的配置以及汉化

    这里给大家一些链接,是关于nopCommerce的一些介绍: nopCommerce的源代码 关于nopcommerce Nopcommerce中文资源 第一步  配置nopCommerce 先上一张 ...

  2. CPrintDialog 构造函数参数详解

    CPrintDialog 构造Windows打印或打印设置对话框(两者不同)     打印对话框                                                     ...

  3. ###Linux基础 - 3

    点击查看Evernote原文. #@author: gr #@date: 2014-10-15 #@email: forgerui@gmail.com 一.GCC编译程序 在Windows下使用Vis ...

  4. ###STL学习--迭代器

    点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的迭代器. ###stl学习 |--迭代 ...

  5. POJ 1099 Square Ice

    Square Ice Description Square Ice is a two-dimensional arrangement of water molecules H2O, with oxyg ...

  6. Skia

    1 What is SKIA. Skia is an open source 2D graphics library which provides common APIs that work acro ...

  7. Linux用户级线程和内核级线程区别

    1.内核级线程: (1)线程的创建.撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调度实体的线程.(2)这些线程可以在全系统内进行资源的竞争.(3)内核空间内为每一个内核支持线程设置了一个线 ...

  8. 51nod1079中国剩余定理

    /** *中国剩余定理 */ #include<iostream> #include<cstdio> #include<map> #include<cstri ...

  9. js组件开发流程

    html代码 <div id="div1"></div> <div id="div2"></div> <d ...

  10. 《Effective Java》读书笔记

    一.引言 1.几条基本规则:(清晰性和简洁性最为重要) 模块的用户永远也不应该被模块的行为所迷惑(那样就不清晰了),模块要尽可能小,但又不能太小 代码应该被重用,而不是被拷贝 模块之间的依赖性应该尽可 ...