题目:树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:
给定的树 A:

3
    / \
   4   5
  / \
 1   2

给定的树 B:

   4 
  /
 1

返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入:A = [1,2,3], B = [3,1]
输出:false

示例 2:

输入:A = [3,4,5,1,2], B = [4,1]
输出:true

限制:

0 <= 节点个数 <= 10000

解题:

  • 首先要遍历A找出与B根节点一样值的节点R
  • 然后判断树A中以R为根节点的子树是否包含和B一样的结构
  • 注意:空树不是任意一个树的子结构
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/class Solution {
public:bool isSubStructure(TreeNode* A, TreeNode* B) {bool res = false;//当TreeA和TreeB都不为零的时候,才进行比较。否则直接返回falseif (A!=NULL && B!=NULL){//如果找到了对应TreeB的根节点的点if (A->val == B->val)//以这个根节点为为起点判断是否包含TreeBres = helper(A, B);//如果找不到,那么就再去TreeA的左子树当作起点,去判断是否包含TreeBif (!res)res = isSubStructure(A->left, B);//如果还找不到,那么就再去TreeA的右子树当作起点,去判断是否包含TreeBif (!res)res = isSubStructure(A->right, B);}// 返回结果return res;}bool helper(TreeNode* A, TreeNode* B){//如果TreeB已经遍历完了都能对应的上,返回trueif (B==NULL)return true;//如果TreeB还没有遍历完,TreeA却遍历完了。返回falseif (A==NULL)return false;//如果其中有一个点没有对应上,返回falseif (A->val != B->val)return false;//如果根节点对应的上,那么就分别去子节点里面匹配return helper(A->left, B->left) && helper(A->right, B->right);}
};

简化代码:

class Solution {
public:bool isSubStructure(TreeNode* A, TreeNode* B) {if (A == NULL || B == NULL) {return false;}return helper(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B);}bool helper(TreeNode* A, TreeNode* B) {if (A == NULL || B == NULL) {return B == NULL ? true : false;}if (A->val != B->val) {return false;}return helper(A->left, B->left) && helper(A->right, B->right);}
};

https://www.jianshu.com/p/a04d73417f7c

剑指offer:面试题26. 树的子结构相关推荐

  1. 剑指Offer - 面试题26. 树的子结构(双重递归)

    1. 题目 输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A:3/ \4 5/ \1 2 ...

  2. 剑指offer面试题26. 树的子结构(链表)

    题目描述 输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 思路 详见链接 代码 class Solution ...

  3. 剑指offer——面试题26:复杂链表的复制

    剑指offer--面试题26:复杂链表的复制 Solution1: 小套路记住就行!!! 根据书上复杂度为O(n)O(n)O(n)的算法写的,此题加深了对于链表指针的理解与应用! /* struct ...

  4. [剑指offer]面试题26:复杂链表的复制

    面试题26:复杂链表的复制 题目:请实现函数ComplexListNodeClone(ComplexListNodepHead),复制一个复杂链表.在复杂链表中,每个结点除了有一个m_pNext指针指 ...

  5. 《剑指Offer》题目:树的子结构

    题目描述:树的子结构 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目分析:此题可以拆成两题,1.在二叉树中查找是否存在某个结点:2.判断两个二叉树是否 ...

  6. 剑指offer(C++)-JZ26:树的子结构(数据结构-树)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(我们约定空树不是任意一个树的子结构) ...

  7. 剑指offer面试题[26]-复杂链表的复制

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...

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

    1. 从根节点开始判断,判断树root2是不是root1的子树.  2. 如果不是,再递归判断root2是不是root1.left的子树.  3. 如果第二步没成立,则再判断root2是不是root1 ...

  9. 【重点递归】剑指offer——面试题18:树的子结构

    剑指offer--面试题18:树的子结构 Solution1: 此题答案是抄的书上的,要记忆并熟练运用关于二叉树的递归思想!!! /* struct TreeNode {int val;struct ...

  10. 剑指offer 面试题三 找出数组中重复的数字

    1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...

最新文章

  1. 如何优雅的设计java异常
  2. Windows Server 2008安装Memcached笔记
  3. python四大软件-太牛逼!一款软件几乎可以操作所有的数据库!
  4. linux日志服务是哪个,『学了就忘』Linux日志管理 — 2.日志服务rsyslogd
  5. 机器学习之贝叶斯垃圾邮件分类
  6. 中国网络安全产业白皮书
  7. button捕捉回车键
  8. linux服务器内存占用太高-释放内存
  9. gitlab ssh key
  10. VM上安装Redhat无法选包
  11. 软件工程项目迭代周报(一)
  12. QIIME2进阶四_QIIME2扩增子基因序列系统发育分析
  13. 谁是最可爱的人,如今又在哪……
  14. MTK USB OTG功能如何打开及实现
  15. 什么是信用违约互换(信用违约掉期) - 债券市场中最常见的信用衍生品
  16. 出海推荐 (出海服务器盘点)
  17. 两个自变量和一个因变量spss_多个自变量对一个因变量的影响(SPSS:协方差分析)...
  18. VVC学习之五:帧内预测——67个模式预测信号生成 predIntraAng()
  19. 三未信安提交招股书注册稿,预计2022年上半年收入同比增两到三成
  20. 查看论文是否被SCI检索

热门文章

  1. 常用 Git 命令清单
  2. 从壹开始微服务 [ DDD ] 之一 ║ D3模式设计初探 与 我的计划书
  3. 关于前端开发的相关资料及例子
  4. 题目1000:计算a+b
  5. 太TM难看了,我自己都看不下去了
  6. NuGet学习笔记(3) 搭建属于自己的NuGet服务器
  7. Ubuntu 12.04安装Sun JDK 6
  8. IEs 4 Linux 新版支撑 IE 7
  9. 3D-2D:PnP算法原理
  10. python查找字符串出现次数_Python 中找出字符串中出现频率最高的字母