关于Leetcode, 问题#572促使用户检查某一树(由于其根基)是否是另一个树的子(根基)。 下面是解决这一问题的:
class Solution:
def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
def isSameTree(p, q):
if not p and not q:
return True
if not p or not q or p.val != q.val:
return False
return isSameTree(p.left, q.left) and isSameTree(p.right, q.right)
def recurse(root, subRoot):
if not root:
return False
elif isSameTree(root, subRoot):
return True
return recurse(root.right, subRoot) or recurse(root.left, subRoot)
return recurse(root, subRoot)
实际上,将要求每 no树中每个 no子都使用<代码>。 在一次电话中,将称为iSameTree(
) ,试图从目前的节点开始“超级树林”。 如果能够成功地与子树的所有组成部分匹配,那么iSameTree(
>将返回True<>。 否则,它将退回<代码>False
。
虽然执行工作是一种特制部队,但我讨论时间和空间复杂性的时间越来越长。 为了分析的目的,让我们说,在节点中潜在的母树的大小由<代码>标明。 N,而分母在分母体内的大小则由<代码>标明。 M。
关于时间的复杂性,我们可以很快得出结论,将存在<条码>。 www.un.org/chinese/ga/president 因此,最糟糕的是,电话总数将达到N*M
。 除补习部分外,每项职能都需要不断的时间才能履行,因此,我们可以说,这一算法是最坏的O(NM)。 虽然这是道理的,但我觉得这种约束可能更加严格。 换言之,对于任意的<代码>N 母树和 M
node subtree, 每一条“代码”都不可能。 Nrecurse(>
>,M
IsSubtree(<)/code> calls;例如,在第一个IsSameTree(
>打电话之后,如果M
不是尺寸1,那么
当涉及辅助空间的复杂性时,这或许更为复杂。 一些民间人士迅速声称,空间的复杂性是_isSameTree(>
,呼吁打上至少<条码>的节点;因此,从母树叶的叶子到底部,电离层的最低点是<条码>。LogN-LogM。 因此,只能有<条码>记录仪-日志/编码><条码>>>。 树木代码>呼吁在一定时间内打上 call;总数为<代码>。 电话:LogN。 在左边,如果要打上<代码><<0>>>recurse(<>>
的电话必须放在母树的叶子上。 在这种情况下,这一<代码>recurse()的电话只能导致最多2个IsSubtree(<>Is/code>的电话。 根据这一逻辑,辅助空间只是
O(LogN)
。 我说所有这一切是为了问:是否有一个辅助空间O(logN)
或O(LogN +logM)
?