14.相同的树另一棵树的子树检查子树二叉树中的列表(教你们使用相同的套路快速解决这四道题)
一、相同的树
这道题是开胃菜的开始,使用递归进行解决
递归三部曲:
- 确定递归函数的参数和返回值
因为我们要比较的是两棵树是否相等,所以参数分别是两棵树的根节点,返回值为boolean类型,即两棵树是否相同,相同则返回true,不相同就返回false,代码如下:
public boolean isSameTree(TreeNode p, TreeNode q){}
- 确定终止条件
要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。
- 左节点和右节点同时为null,返回true
- 左节点为空,右节点不为空或者左节点不为空,右节点为空,返回false
此时已经排除掉了节点为空的情况,那么剩下的就是左右节点不为空: - 左右节点的值不相同,返回false
if(p == null && q == null){return true;}else if((p == null && q != null) || (p != null && q == null)){return false;}else if(p.val != q.val){return false;}
- 确定单层递归的逻辑
此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。
递归进行判断p和q左子树是否相同以及p和q右子树是否相同,代码如下:
return isSameTree(p.left,q.left) && isSameTree(p.right,q.right)
Java整体代码如下:
class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {if(p == null && q == null){return true;}if(p == null || q == null){return false;}if(p.val != q.val){return false;}return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);}
}
二、另一棵树的子树
这道题其实和上面题思路是一样的,唯一的不同就是上面的题只需要比较一个root结点,而这道题是需要用第一棵树中的每个结点去匹配subRoot结点。所以就多加一个深度搜索的过程(即判断以第一棵树的每个结点为root结点与subTree子树是否为同一棵树),代码如下:
class Solution {public boolean isSubtree(TreeNode root, TreeNode subRoot) {if(subRoot == null) return true;if(root == null) return false;return isSubtree(root.left,subRoot) || isSubtree(root.right,subRoot) || isSameTree(root,subRoot);}//判断两棵树是否相同public boolean isSameTree(TreeNode p,TreeNode q){if(p == null && q == null){return true;}if(p == null || q == null){return false;}if(p.val != q.val) return false;return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);}
}
三、检查子树
这道题与另一棵树的子树的解法一模一样,直接上代码:
class Solution {public boolean checkSubTree(TreeNode t1, TreeNode t2) {if(t2 == null) return true;if(t1 == null) return false;return checkSubTree(t1.left,t2) || checkSubTree(t1.right,t2) || isSameTree(t1,t2);}public boolean isSameTree(TreeNode p,TreeNode q){if(p == null && q == null){return true;}if(p == null || q == null){return false;}if(p.val != q.val) return false;return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);}
}
四、二叉树中的列表
这道题与上面两道题的不同是,其中一个参数是二叉树,另外一个参数是列表,但是解决的思路和上面一致。细节上有一点需要注意的,就是isSame函数最后的return,前面两道题是isSame(p.left,q.left) && isSame(p.right,q.right);
这里的符号用的是&&并且,因为两棵树相同不仅仅需要左子树相同并且右子树也需要相同。而本题中最后return的是return isSame(newHead.next,node.left) || isSame(newHead.next,node.right);
这里用的符号是||或者,因为本题中另外一个参数是一个列表,只要左子树或者右子树中的任意一个匹配上链表就可以,所以用的是||或者符号。这里需要读者注意一下。其他地方基本一样,代码如下:
class Solution {public boolean isSubPath(ListNode head, TreeNode root) {if(head == null) return true;if(root == null) return false;return isSubPath(head,root.left) || isSubPath(head,root.right) || isSame(head,root);}public boolean isSame(ListNode newHead,TreeNode node){if(newHead == null) return true;if(node == null) return false;if(newHead.val != node.val) return false;return isSame(newHead.next,node.left) || isSame(newHead.next,node.right);}
}
五、总结
LeetCode中应该还有很多这种相似的题,希望大家看完我的解法,能够做到举一反三。
14.相同的树另一棵树的子树检查子树二叉树中的列表(教你们使用相同的套路快速解决这四道题)相关推荐
- 一颗树,两棵树,三棵树_TREE_TO_Tree
树 Tree 数据结构图形解析非常直观 树(Tree)介绍 树(Tree): 一种非线性表结构.是由n(n>=1)个有限结点组成一个具有层次关系的集合. 特点 每个结点有零个或多个子结点:没有父 ...
- 树如何找共同祖先_如何找到任何二叉树中两个节点的最低公共祖先?
小编典典 尼克·约翰逊是正确的,一个一个O(n)的时间复杂度算法是最好的,如果你没有父指针,你可以做.)对于算法的一个简单的递归版本中看到代码金丁的职务)它运行在O(n)的时间. 但是请记住,如果您的 ...
- 随机森林分类预测(多棵树)
随机森林工具包(修改版): https://download.csdn.net/download/weixin_37928884/87230131 决策树与随机森林代码以及数据: https://do ...
- 11.数据结构:认识一棵树
大家好,我是王有志.关注王有志,回复DSA获取数据结构和算法学习资源. 今天我们要学习的是你编程生涯中不可避免的话题–树,无论是二分搜索树,红黑树,B+树,还是机器学习中的决策树和随机森林,都和树息息 ...
- [支配树][lca][倍增][线段树][拓扑] Jzoj P4240 游行
Description 恶梦是学校里面的学生会主席.他今天非常的兴奋,因为学校一年一度的学生节开始啦!! 在这次节日上总共有N个节目,并且总共也有N个舞台供大家表演.其中第i个节目的表演时间为第i个单 ...
- YbtOJ-交换游戏【树链剖分,线段树合并】
正题 题目大意 给出两棵树,对于第一棵树的每一条边(x,y)(x,y)(x,y)询问有多少条在第二棵树上的边(u,v)(u,v)(u,v)与其交换(连接的序号相同)后两棵树依旧是一棵树. 1≤n≤2× ...
- python数据结构 树_Python数据结构——AVL树的实现
既然,我们已经证明,保持 AVL 树的平衡将会使性能得到很大的提升,那我们看看如何在程序中向树插入一个新的键值.因为所有的新键是作为叶节点插入树的,而新叶子的平衡因子为零,所以我们对新插入的节点不作调 ...
- 线段树和zkw线段树
作者作为一个蒟蒻,也是最近才自学了线段树,不对的地方欢迎大佬们评论,但是不要喷谢谢 好啦,我们就开始说说线段树吧 线段树是个支持区间操作和查询的东东,平时的话还是蛮实用的 下面以最基本的区间加以及查询 ...
- bzoj 1901: Zju2112 Dynamic Rankings(离线树状数组+主席树)
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 8144 Solved: 3378 [ ...
最新文章
- 谈谈最近独立做项目的一些事情,一些小经验,分享之!
- Percona Server for MySQL 5.5.30-30.2
- Unity 中渲染顺序的理解以及一些坑点 以及2.5D游戏中的渲染排序解决方案
- jacky解读麻省理工《计算机科学与Python编程导论》第1集
- python unittest教程_Python Unittest原理及基本使用方法
- 《Python自动化》学习笔记:shutil模块使用介绍
- Nginx 412 Precondition Failed
- UE5 C++ Rider 编程指南 1.编辑器基础
- redis当中各种数据类型的操作
- python编写一个程序、输入一个数判断其是偶数还是奇数_编写一个程序,判断用户输入的整数是偶数还是奇数。 (7.0分)_学小易找答案...
- Android 9.0 新特性
- php 删除文件 unlink,php 删除文件函数unlink及删除文件夹示例
- 【面试经典】求解金矿问题(动态规划初级)
- mega盘要_[MEGA DEAL]支付您想要的:2018机器学习套件(99%折扣)
- IAP 15 数据写入 flash
- 60级怀旧服最新服务器人口排名,魔兽世界怀旧服人口普查2019 wow怀旧服人口比例查询最新...
- VMware 14 安装 macOS10.13 详细图文教程
- 如何设置html打印区域大小,excel如何设置打印区域
- IISExpress异常退出的问题
- 涉密计算机应当拆除涉密哪些部件,在选购涉密计算机时应特别注意什么
热门文章
- oc中在控件上显示图片
- CentOS 7 安装Boost 1.67及boost_python
- 松本行弘:我的编程人生
- 又爱又恨的 Microsoft Edge!
- Bio-protocol第一届生物实验短视频大赛集锦(三)——软件使用篇
- Cell封面:王二涛组在丛枝菌根共生“自我调节”研究中取得重大进展(视频+漫画解读)...
- 做科研已经很辛苦了,为什么还要做PPT汇报?
- antiSMASH数据库:微生物次生代谢物合成基因组簇查询和预测
- cmt跟踪算法 matlab_“水上大疆”招聘——雷达算法工程师
- pandas使用sort_values函数将dataframe按照指定数据列的内容对dataframe的数据行进行排序(sort dataframe rows by a specific column