判断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))