LeetCode算法题-Subtree of Another Tree(Java实现)
这是悦乐书的第265次更新,第278篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第132题(顺位题号是572)。给定两个非空的二进制树s和t,检查树t是否具有完全相同的结构和具有子树s的节点值。 s的子树是一个树,由s中的节点和所有节点的后代组成。 树也可以被视为自己的子树。例如:
鉴于树s:
3
/ \
4 5
/ \
1 2
鉴于树t:
4
/ \
1 2
返回true,因为t具有相同的结构和节点值,其子树为s。
鉴于树s:
3
/ \
4 5
/ \
1 2
/
0
鉴于树t:
4
/ \
1 2
返回false。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
要判断t是不是s的子树,最直接的就是遍历s的节点,以每一个s的节点为新的子树去和t比较,而比较的方法需要借助一个递归的方法来完成,来判断两个二叉树是不是相同的结构和相同的值。所以我们需要先使用一个队列,来遍历s的每一个节点,拿到每一个节点后,作为新的二叉树去和t比较,直到找到合适节点开始的子树与t相同,否则返回false。
public boolean isSubtree(TreeNode s, TreeNode t) {
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(s);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
if (isSame(node, t)) {
return true;
}
}
return false;
}
public boolean isSame(TreeNode s, TreeNode t){
if (s == null || t == null) {
return s == t;
}
return s.val == t.val && isSame(s.left, t.left) && isSame(s.right, t.right);
}
03 第二种解法
我们也可以把第一种解法的队列去掉,也换成递归的方法,但是思路还是一样的,需要拿s的每一个节点去比对。
public boolean isSubtree2(TreeNode s, TreeNode t) {
if (s == null) {
return false;
}
return isSame2(s, t) || isSubtree2(s.left, t) || isSubtree2(s.right, t);
}
public boolean isSame2(TreeNode s, TreeNode t){
if (s == null || t == null) {
return s == t;
}
return s.val == t.val && isSame(s.left, t.left) && isSame(s.right, t.right);
}
04 第三种解法
将上面的解法再精简下,只使用一个递归方法。我们知道,只有在s中找到合适的开始节点值(与t的根节点值相等),才能去判断以该节点作为开始节点的子树是否和t是相同结构的,找不到就只能继续找s的左节点值或右节点值了。
要想只使用一个递归,那么必须再引入一个参数,来判断当前s的节点值是否与t的根节点值相等。如果相等,那么依次遍历s当前节点的左右节点与t的左右子节点,要是所有节点值都相等,那么就可以返回true。如果不相等,那么就需要兵分两路,s当前节点的左节点与t继续比较,s当前节点的右节点与t继续比较,并且第三个参数为false。
public boolean isSubtree3(TreeNode s, TreeNode t) {
return isSameTree(s, t, false);
}
public boolean isSameTree (TreeNode s, TreeNode t, boolean flag) {
if (s == null || t == null) {
return s == t;
}
if (flag && s.val != t.val) {
return false;
}
if (s.val == t.val) {
if (isSameTree(s.left, t.left, true) && isSameTree(s.right, t.right, true)) {
return true;
}
}
return isSameTree(s.left, t, false) || isSameTree(s.right, t, false);
}
05 第四种解法
我们也可以借助字符串和其子串的思路,将s和t的每一个节点都遍历出来,组成一个字符串,然后去判断t所组成的字符串是不是s所组成字符串的子串。
public boolean isSubtree4(TreeNode s, TreeNode t) {
String tree = getTreeString(s, true);
String tree2 = getTreeString(t, true);
return tree.indexOf(tree2) > -1;
}
public String getTreeString(TreeNode t, boolean left) {
if (t == null) {
return left ? "lnull" : "rnull";
}
return "#"+t.val + " " +getTreeString(t.left, true)+" " +getTreeString(t.right, false);
}
06 小结
算法专题目前已日更超过四个月,算法题文章132+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Subtree of Another Tree(Java实现)的更多相关文章
- LeetCode算法题-Diameter of Binary Tree(Java实现)
这是悦乐书的第257次更新,第270篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第124题(顺位题号是543).给定二叉树,您需要计算树的直径长度. 二叉树的直径是树中 ...
- LeetCode算法题-Longest Univalue Path(Java实现)
这是悦乐书的第290次更新,第308篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第158题(顺位题号是687).给定二叉树,找到路径中每个节点具有相同值的最长路径的长度 ...
- LeetCode算法题-Subdomain Visit Count(Java实现)
这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...
- LeetCode算法题-Letter Case Permutation(Java实现)
这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...
- LeetCode算法题-Jewels and Stones(Java实现)
这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...
- LeetCode算法题-Reach a Number(Java实现)
这是悦乐书的第310次更新,第331篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第179题(顺位题号是754).你站在无限数字线的0号位置.在目的地有个target.在 ...
- LeetCode算法题-Shortest Completing Word(Java实现)
这是悦乐书的第309次更新,第330篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第178题(顺位题号是748).从给定的字典单词中查找最小长度单词,其中包含字符串lic ...
- LeetCode算法题-Self Dividing Numbers(Java实现)
这是悦乐书的第305次更新,第324篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是728).自分割数是一个可被其包含的每个数字整除的数字.例如,12 ...
- LeetCode算法题-Find Pivot Index(Java实现)
这是悦乐书的第304次更新,第323篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第172题(顺位题号是724).给定一个整数nums数组,编写一个返回此数组的" ...
随机推荐
- 微信小程序开发测试
微信小程序 在2017-01-09正式上线,本着跟上时代潮流的精神,写一份教程来看看 微信IDE下载地址为: 微信IDE 在windows下直接 双击 exe安装即可,安装完成后的界面如下: 得到这个 ...
- 【Scala篇】--Scala中集合数组,list,set,map,元祖
一.前述 Scala在常用的集合的类别有数组,List,Set,Map,元祖. 二.具体实现 数组 1.创建数组 new Array[Int](10) 赋值:arr(0) = xxx Array[ ...
- 甘果移动老甘:移动互联网变迁中的App和小程序
2018 年 10 月13 日,由又拍云和知晓云联合主办的 Open Talk 丨2018 小程序开发者沙龙系列活动广州站拉开帷幕,甘果移动的 CEO 路文杰(老甘)在沙龙上做了<移动互联网变迁 ...
- Java核心技术及面试指南的视频讲解和代码下载位置
都是百度云盘,均无密码 代码下载位置: https://pan.baidu.com/s/1I44ob0vygMxvmj2BoNioAQ 视频讲解位置: https://pan.baidu.com/s/ ...
- java设计模式(1)---总则
设计模式总则 一.概述 1.什么是设计模式 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 解释下: 分类编目:就是说可以找到一些特征去划分这些设计模式,从而进行分类. ...
- 带着新人学springboot的应用04(springboot+mybatis+redis 完)
对于缓存也说了比较多了,大家对下图这一堆配置类现在应该有些很粗略的认识了(因为我也就很粗略的认识了一下,哈哈!),咳,那么我们怎么切换这个缓存呢?(就是不用springboot提供的默认的Simple ...
- 设计模式总结篇系列:模板方法模式(Template Method)
模板方法模式需要开发抽象类和具体子类之间的协作.抽象类负责给出一个算法的轮廓和骨架,子类则负责给出这个算法的各个逻辑步骤.代表这些具体逻辑步骤的方法称做基本方法(primitive method):而 ...
- spring源码分析之spring-jdbc模块详解
0 概述 Spring将替我们完成所有使用JDBC API进行开发的单调乏味的.底层细节处理工作.下表描述了哪些是spring帮助我们做好的,哪些是我们要做的. Action Spring You ...
- Powershell:关于hashtable你想知道的一切
译者语:本篇为一篇译文,详细介绍了在powershell中如何使用hashtable这种数据类型.本文为本人2018年最后一篇博文(哈哈,一年内写没写几篇),也是本人的第一次译文,有不足之处还请指教. ...
- Go语言系列文章
这个系列写的不是很好,未来重构. Go基础系列 Go基础 Go基础 1.Go简介 2.Go数据结构struct 3.构建Go程序 4.import导包和初始化阶段 5.array 6.Slice详解 ...