判断b树是否为a树的子树,首先需要先应用一个先序遍历来寻找与b树根结点相同的a树的子结点,之后再进行递归判断每一侧是否相同。
该题难点在于递归,掌握以后应该关于树的子结构题可以通杀。

图片转自:力扣
先进性先序遍历(直接利用原题的函数进行遍历就可以),在遍历的时候添加上条件即可(利用python特性可以实现一行判断)。
递归永远先写终止递归进行回溯的条件,该题终止递归的条件为b树无根结点(即B为空)
因为要判断b树的根结点是否与a树的当前节点相同所以在定义recur函数时需要判断ab当前节点是否相等,不等直接return false并且要or一个a树为空,a树为空因为上面先进性判断b树为空,a树为空则也直接返回false
在函数内递归只需要recur两个树的左右结点,之间使用and。
return bool(A and B) and (recur(A,B) or self.isSubStructure(A.left,B) or self.isSubStructure(A.right,B))
这一行为精髓,布尔值判断ab是否为空,有一个为空就返回假,之后and一下函数对两个结点
,然后or进行递归,分别a.left,b,a.right,b。(其实就是先序遍历,or对递归满足其一即可。)
class Solution:
def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool:
def recur(A,B):
if not B :return True
if not A or A.val !=B.val:
return False
return recur(A.left,B.left) and recur(A.right,B.right)
return bool(A and B) and (recur(A,B) or self.isSubStructure(A.left,B) or self.isSubStructure(A.right,B))
本文探讨了如何判断一棵树是否为另一棵树的子结构,核心在于使用先序遍历并递归比较节点。通过定义一个辅助函数`recur`来检查A树的子节点是否匹配B树,并在遍历过程中进行终止条件判断。最终实现了一种通用的解决方案,适用于所有关于树的子结构问题。
&spm=1001.2101.3001.5002&articleId=120837020&d=1&t=3&u=e8d0d5d1710842689b30572d46be5934)
537

被折叠的 条评论
为什么被折叠?



