看题解时,很多大牛用很少的代码就完成了AC,但可能看了很多遍也看不懂,因此萌生了写一种最“笨”最完整的代码的想法,这样大家可以通过我的代码入门,看懂了再去挑战大牛们的简洁解法。


输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。

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

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

限制:
0 <= 节点个数 <= 10000


核心思路

1、找到哪种树满足递归的条件

  1. 以A的根节点开始,其部分结构与B相同
  2. 以A左子树的某个节点开始,其部分结构与B相同
  3. 以A右子树的某个节点开始,其部分结构与B相同

2、对上述三种树进行判断
判断条件:两棵树在该节点的值是否相等,并且递归其左子树和右子树,重复上述判断

3、至此,我们将这道题拆分成了两步,但无论是找树,还是对树进行同构判断,都需要进行递归。因此我们需要写两个方法来进行递归处理。 代码如下。

注意:解树相关的题,最重要的两个关键词是递归鲁棒性(鲁棒性即对空指针进行处理,保证程序的健壮性)


代码一:普通解法

static class Solution{// 什么样的树满足条件public boolean isSubStructure(TreeNode A, TreeNode B) {if(A == null || B == null)return false;if((A.val == B.val) && (dfs(A.left, B.left) && dfs(A.right, B.right)))return true;return isSubStructure(A.left, B) || isSubStructure(A.right, B);}// 判断某种树满足条件的过程public boolean dfs(TreeNode A, TreeNode B) {if(B == null)return true;if(A == null)return false;if(A.val == B.val)return dfs(A.left, B.left) && dfs(A.right, B.right);elsereturn false;}
}

代码二:简洁解法


class Solution{public boolean isSubStructure(TreeNode A, TreeNode B) {if(A == null && B == null) return false;return dfs(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);}public boolean dfs(TreeNode A, TreeNode B) {if(B == null) return true;if(A == null || A.val != B.val) return false;return dfs(A.left,B.left) && dfs(A.right, B.right);}
}

孤独是非常有必要的,一个人在孤独时间所做的事情,决定了这个人和其他人根本的不同

【无取巧解法,易于理解!】剑指 Offer 26. 树的子结构相关推荐

  1. 左神算法:判断 t1 树是否包含t2 树全部的拓扑结构(剑指 Offer 26. 树的子结构,Java版)

    本题来自左神<程序员代码面试指南>"判断 t1 树是否包含t2 树全部的拓扑结构"题目. 题目 剑指 Offer 26. 树的子结构 给定彼此独立的两棵树头节点分别为 ...

  2. 【LeetCode】剑指 Offer 26. 树的子结构

    [LeetCode]剑指 Offer 26. 树的子结构 文章目录 [LeetCode]剑指 Offer 26. 树的子结构 package offer;//定义树节点 class TreeNode{ ...

  3. 剑指offer——26.树的子结构(不太熟)

    题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 知识点: 无 注意: 注意想法的递归实现(好好琢磨一下,不然可能会忘!) 代码实现: 具体实现分两步 ...

  4. LeetCode——剑指 Offer 26. 树的子结构

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

  5. 剑指 Offer 26树的子结构(相关话题:对称性递归,在线算法)

    目录 开篇引言 题目描述 代码实现 题目拓展 拓展解读 一类 100. 相同的树

  6. 剑指offer 26 树的子结构

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

  7. 剑指offer:树的子结构

    题目 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 暴力做法 取出树A/B的前序.中序: 判断这两个数组是否A都包含B,是则true. 前序和中 ...

  8. 【剑指offer】树的子结构

    输入两颗二叉树A,B,判断B是不是A的子结构. 图中,树B就是树A的一个子结构 思路: 首先,从树A的根节点开始,判断树B是否是从该根节点开始与树A重合.如果不是,继续判断左右子树. 重合判定:当前的 ...

  9. 《剑指offer》-- 树的子结构、二叉树的镜像、二叉树的深度、平衡二叉树

    一. 树的子结构: 1.题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构. 2.解题思路: 这个题比较简单,利用递归的方式就可以判断B是不是A树的子结构 ...

最新文章

  1. 电脑硬件学习(主板,CPU,内存,硬盘,显卡)
  2. 中国年度AI省市格局:北广上稳居前三,江苏四川力压浙江,山西转型“挖数据”增速迅猛...
  3. xml gridview控件增删改查_Mybatis之XML如何映射到方法
  4. 重写 隐藏 java_Java中方法的重写与成员变量的隐藏
  5. 依次输入表(30,15,28,20,24,10,68,35,50)中的元素,生成一棵平衡的二叉排序树。请画出构造过程,并在其中注明每一次平衡化的类型(LL型、RR型、LR型、RL型)
  6. Android开发之The application could not be installed: INSTALL_FAILED_VERSION_DOWNGRADE报错
  7. java常用类总结_java——常用类的总结
  8. Java:对double值进行四舍五入,保留两位小数的几种方法
  9. React开发(128):ant design学习指南之input中addonBefore
  10. CoreData 自定义数据类型
  11. Centos7 下安装mariadb及其基本操作
  12. 08.Thymeleaf的应用(国际化和抽取公共页面)
  13. java pdf打印解决方案,将pdf转为图片进行打印
  14. 太空探测器 java_宇宙究竟有多大?这个探测器或将告诉你答案
  15. 王者荣耀赛季更新服务器维护到什么时候,王者荣耀s9维护到几点 王者荣耀s10赛季上线时间一览...
  16. [转]设置IE背景色保护你的眼睛视力_鹤壁吧_贴吧
  17. 总是过目即忘,试试建立知识库吧
  18. STM32驱动_cc2420
  19. 【综述】A Comprehensive Survey on Graph NeuralNetworks(1)
  20. 日期问题合集(时令、时区)

热门文章

  1. 非常精确的测试运行时间(比clock()更精确些)
  2. 为 Android 编译 MuPDF 查看器
  3. 亿级流量系统架构演进之路
  4. ClickHouse 副本协同原理:ReplicatedMergeTree引擎
  5. Python计算一个文件中大写字母的数量
  6. 如何快速过滤出一次请求的所有日志?
  7. 高并发之API接口,分布式,防刷限流,如何做?
  8. STL中算法锦集(四)
  9. 历经5代跨越25年的RTC架构演化史
  10. Cmake的CMakeLists.txt写法示例