【无取巧解法,易于理解!】剑指 Offer 26. 树的子结构
看题解时,很多大牛用很少的代码就完成了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、找到哪种树满足递归的条件
- 以A的根节点开始,其部分结构与B相同
- 以A左子树的某个节点开始,其部分结构与B相同
- 以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. 树的子结构相关推荐
- 左神算法:判断 t1 树是否包含t2 树全部的拓扑结构(剑指 Offer 26. 树的子结构,Java版)
本题来自左神<程序员代码面试指南>"判断 t1 树是否包含t2 树全部的拓扑结构"题目. 题目 剑指 Offer 26. 树的子结构 给定彼此独立的两棵树头节点分别为 ...
- 【LeetCode】剑指 Offer 26. 树的子结构
[LeetCode]剑指 Offer 26. 树的子结构 文章目录 [LeetCode]剑指 Offer 26. 树的子结构 package offer;//定义树节点 class TreeNode{ ...
- 剑指offer——26.树的子结构(不太熟)
题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 知识点: 无 注意: 注意想法的递归实现(好好琢磨一下,不然可能会忘!) 代码实现: 具体实现分两步 ...
- LeetCode——剑指 Offer 26. 树的子结构
一.题目 输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A: 3/ \4 5/ \1 2 ...
- 剑指 Offer 26树的子结构(相关话题:对称性递归,在线算法)
目录 开篇引言 题目描述 代码实现 题目拓展 拓展解读 一类 100. 相同的树
- 剑指offer 26 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A: 3 / \ 4 5 / 1 2 给定 ...
- 剑指offer:树的子结构
题目 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 暴力做法 取出树A/B的前序.中序: 判断这两个数组是否A都包含B,是则true. 前序和中 ...
- 【剑指offer】树的子结构
输入两颗二叉树A,B,判断B是不是A的子结构. 图中,树B就是树A的一个子结构 思路: 首先,从树A的根节点开始,判断树B是否是从该根节点开始与树A重合.如果不是,继续判断左右子树. 重合判定:当前的 ...
- 《剑指offer》-- 树的子结构、二叉树的镜像、二叉树的深度、平衡二叉树
一. 树的子结构: 1.题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构. 2.解题思路: 这个题比较简单,利用递归的方式就可以判断B是不是A树的子结构 ...
最新文章
- 电脑硬件学习(主板,CPU,内存,硬盘,显卡)
- 中国年度AI省市格局:北广上稳居前三,江苏四川力压浙江,山西转型“挖数据”增速迅猛...
- xml gridview控件增删改查_Mybatis之XML如何映射到方法
- 重写 隐藏 java_Java中方法的重写与成员变量的隐藏
- 依次输入表(30,15,28,20,24,10,68,35,50)中的元素,生成一棵平衡的二叉排序树。请画出构造过程,并在其中注明每一次平衡化的类型(LL型、RR型、LR型、RL型)
- Android开发之The application could not be installed: INSTALL_FAILED_VERSION_DOWNGRADE报错
- java常用类总结_java——常用类的总结
- Java:对double值进行四舍五入,保留两位小数的几种方法
- React开发(128):ant design学习指南之input中addonBefore
- CoreData 自定义数据类型
- Centos7 下安装mariadb及其基本操作
- 08.Thymeleaf的应用(国际化和抽取公共页面)
- java pdf打印解决方案,将pdf转为图片进行打印
- 太空探测器 java_宇宙究竟有多大?这个探测器或将告诉你答案
- 王者荣耀赛季更新服务器维护到什么时候,王者荣耀s9维护到几点 王者荣耀s10赛季上线时间一览...
- [转]设置IE背景色保护你的眼睛视力_鹤壁吧_贴吧
- 总是过目即忘,试试建立知识库吧
- STM32驱动_cc2420
- 【综述】A Comprehensive Survey on Graph NeuralNetworks(1)
- 日期问题合集(时令、时区)