LeetCode另一棵树的子树
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
示例 1:
输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true
示例 2:
输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
输出:false
思路:
题目中给了两个二叉树,要判断其中一个是不是另一个的子树,只需要一个主要的递归函数isSub就可以搞定了。(在这个主要的递归函数中会使用另一个递归函数same作为工具)
在这个递归函数isSub中,首先判断是不是两棵二叉树一模一样(这就相当于是base case了),如果一样的话就证明我们找到了这个结构,返回True;否则就继续拿这棵树的左子树和右子树继续往下判断。
这里判断两棵树一模一样的操作,也需要我们写一个函数same来做,它也是一个递归函数,作用就是判断传入的两个节点组成的树是否相同。(具体细节就很简单啦,判断完节点的值,就继续递归地判断左右子节点,看代码就很清楚了)
代码:
class Solution(object):
def isSubtree(self, root, subRoot):
def same(root,subRoot):#工具函数,判断两个二叉树是否一模一样
if not root and not subRoot:return True#如果都是空,也是相同
if not root or not subRoot:return False#有一个是空,必不相同
if root.val!=subRoot.val:#都不为空时,值不同,不相同
return False
else:#其他情况,只能是都不为空,且值相同
#接下来判断两者的左子树和右子树,都要分别相同
return same(root.left,subRoot.left) and same(root.right,subRoot.right)
def isSub(root,subRoot):#主要递归函数
if not root: return False#如果root都没有,肯定没法包含subRoot
if same(root,subRoot):#如果root和subRoot一模一样了 则返回True
return True
#其他情况,将root的左右分别送入递归,有其中一个返回True就是True
return isSub(root.left,subRoot) or isSub(root.right,subRoot)
return isSub(root,subRoot)#正式调用,就这一句话
小结:
这道题写起来和判断平衡二叉树的题目差不多,使用两个递归函数。其中一个只是辅助的工具,主要逻辑还是在isSub函数中体现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了