一、相同的树


这道题是开胃菜的开始,使用递归进行解决

递归三部曲:

  1. 确定递归函数的参数和返回值
    因为我们要比较的是两棵树是否相等,所以参数分别是两棵树的根节点,返回值为boolean类型,即两棵树是否相同,相同则返回true,不相同就返回false,代码如下:
public boolean isSameTree(TreeNode p, TreeNode q){}
  1. 确定终止条件
    要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。
  • 左节点和右节点同时为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;}
  1. 确定单层递归的逻辑
    此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。
    递归进行判断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.相同的树另一棵树的子树检查子树二叉树中的列表(教你们使用相同的套路快速解决这四道题)相关推荐

  1. 一颗树,两棵树,三棵树_TREE_TO_Tree

    树 Tree 数据结构图形解析非常直观 树(Tree)介绍 树(Tree): 一种非线性表结构.是由n(n>=1)个有限结点组成一个具有层次关系的集合. 特点 每个结点有零个或多个子结点:没有父 ...

  2. 树如何找共同祖先_如何找到任何二叉树中两个节点的最低公共祖先?

    小编典典 尼克·约翰逊是正确的,一个一个O(n)的时间复杂度算法是最好的,如果你没有父指针,你可以做.)对于算法的一个简单的递归版本中看到代码金丁的职务)它运行在O(n)的时间. 但是请记住,如果您的 ...

  3. 随机森林分类预测(多棵树)

    随机森林工具包(修改版): https://download.csdn.net/download/weixin_37928884/87230131 决策树与随机森林代码以及数据: https://do ...

  4. 11.数据结构:认识一棵树

    大家好,我是王有志.关注王有志,回复DSA获取数据结构和算法学习资源. 今天我们要学习的是你编程生涯中不可避免的话题–树,无论是二分搜索树,红黑树,B+树,还是机器学习中的决策树和随机森林,都和树息息 ...

  5. [支配树][lca][倍增][线段树][拓扑] Jzoj P4240 游行

    Description 恶梦是学校里面的学生会主席.他今天非常的兴奋,因为学校一年一度的学生节开始啦!! 在这次节日上总共有N个节目,并且总共也有N个舞台供大家表演.其中第i个节目的表演时间为第i个单 ...

  6. YbtOJ-交换游戏【树链剖分,线段树合并】

    正题 题目大意 给出两棵树,对于第一棵树的每一条边(x,y)(x,y)(x,y)询问有多少条在第二棵树上的边(u,v)(u,v)(u,v)与其交换(连接的序号相同)后两棵树依旧是一棵树. 1≤n≤2× ...

  7. python数据结构 树_Python数据结构——AVL树的实现

    既然,我们已经证明,保持 AVL 树的平衡将会使性能得到很大的提升,那我们看看如何在程序中向树插入一个新的键值.因为所有的新键是作为叶节点插入树的,而新叶子的平衡因子为零,所以我们对新插入的节点不作调 ...

  8. 线段树和zkw线段树

    作者作为一个蒟蒻,也是最近才自学了线段树,不对的地方欢迎大佬们评论,但是不要喷谢谢 好啦,我们就开始说说线段树吧 线段树是个支持区间操作和查询的东东,平时的话还是蛮实用的 下面以最基本的区间加以及查询 ...

  9. bzoj 1901: Zju2112 Dynamic Rankings(离线树状数组+主席树)

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 8144  Solved: 3378 [ ...

最新文章

  1. 谈谈最近独立做项目的一些事情,一些小经验,分享之!
  2. Percona Server for MySQL 5.5.30-30.2
  3. Unity 中渲染顺序的理解以及一些坑点 以及2.5D游戏中的渲染排序解决方案
  4. jacky解读麻省理工《计算机科学与Python编程导论》第1集
  5. python unittest教程_Python Unittest原理及基本使用方法
  6. 《Python自动化》学习笔记:shutil模块使用介绍
  7. Nginx 412 Precondition Failed
  8. UE5 C++ Rider 编程指南 1.编辑器基础
  9. redis当中各种数据类型的操作
  10. python编写一个程序、输入一个数判断其是偶数还是奇数_编写一个程序,判断用户输入的整数是偶数还是奇数。 (7.0分)_学小易找答案...
  11. Android 9.0 新特性
  12. php 删除文件 unlink,php 删除文件函数unlink及删除文件夹示例
  13. 【面试经典】求解金矿问题(动态规划初级)
  14. mega盘要_[MEGA DEAL]支付您想要的:2018机器学习套件(99%折扣)
  15. IAP 15 数据写入 flash
  16. 60级怀旧服最新服务器人口排名,魔兽世界怀旧服人口普查2019 wow怀旧服人口比例查询最新...
  17. VMware 14 安装 macOS10.13 详细图文教程
  18. 如何设置html打印区域大小,excel如何设置打印区域
  19. IISExpress异常退出的问题
  20. 涉密计算机应当拆除涉密哪些部件,在选购涉密计算机时应特别注意什么

热门文章

  1. oc中在控件上显示图片
  2. CentOS 7 安装Boost 1.67及boost_python
  3. 松本行弘:我的编程人生
  4. 又爱又恨的 Microsoft Edge!
  5. Bio-protocol第一届生物实验短视频大赛集锦(三)——软件使用篇
  6. Cell封面:王二涛组在丛枝菌根共生“自我调节”研究中取得重大进展(视频+漫画解读)...
  7. 做科研已经很辛苦了,为什么还要做PPT汇报?
  8. antiSMASH数据库:微生物次生代谢物合成基因组簇查询和预测
  9. cmt跟踪算法 matlab_“水上大疆”招聘——雷达算法工程师
  10. pandas使用sort_values函数将dataframe按照指定数据列的内容对dataframe的数据行进行排序(sort dataframe rows by a specific column