classSolution: deflowestCommonAncestor(self, R: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': deff(C): nonlocal ans if C isNone: returnFalse if C: l=f(C.left) r=f(C.right) found=C==p or C==q if l+r+found>=2: ans=C return found or l or r ans=None f(R) return ans
classSolution: deflowestCommonAncestor(self, R: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': if R isNone: returnNone A=[R] parent={R:None} whileTrue: if p in parent and q in parent: break C=A.pop() if C.left: A.append(C.left) parent[C.left]=C if C.right: A.append(C.right) parent[C.right]=C seen=set() while p: seen.add(p) p=parent[p] # (1) # find parent until parent has been seen in step (1) while q notin seen: q=parent[q] return q