在一次工作面试中,我被问到以下问题:
给定一个根节点(到一个结构良好的二叉树)和两个其他节点(保证在树中,并且也是不同的),返回两个节点的最低共同祖先。
我不知道任何最不常见的祖先算法,所以我试图当场制作一个。我生成了以下代码:
def least_common_ancestor(root, a, b):
lca = [None]
def check_subtree(subtree, lca=lca):
if lca[0] is not None or subtree is None:
return 0
if subtree is a or subtree is b:
return 1
else:
ans = sum(check_subtree(n) for n in (subtree.left, subtree.right))
if ans == 2:
lca[0] = subtree
return 0
return ans
check_subtree(root)
return lca[0]
class Node:
def __init__(self, left, right):
self.left = left
self.right = right
我尝试了以下测试用例并得到了我期望的答案:
a = Node(None, None)
b = Node(None, None)
tree = Node(Node(Node(None, a), b), None)
tree2 = Node(a, Node(Node(None, None), b))
tree3 = Node(a, b)
但我的面试官告诉我“有一类树,你的算法会返回 None。” 我不知道那是什么,我把面试搞砸了。我想不出算法会在不ans
变成 2 的情况下到达树底部的情况——我错过了什么?