我提出以下问题在面试:这个最不常见的祖先算法有什么问题?
给出一个根节点(到井形成二叉树)和其他两个节点(这是保证在树上,并且也不同) ,返回两个节点的最低共同祖先。
我不知道任何最不常见的祖先算法,所以我试图在现场制作一个。我公司生产的以下代码:
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的情况 - 我错过了什么?
现在让'b'成为'a'的子节点,反之亦然。 – 2014-12-07 10:43:43
@MartijnPieters啊,谢谢,就是这样。如果你能够做出答案,我很乐意接受。否则,也许我应该删除这个问题? – 2014-12-07 10:46:05
你似乎认为a和b在它们的lca的不同子树中。这不是一个好的假设。从边界案例开始。 'a是b','a是根',树只剩下分支等。你会感到惊讶。 – 2014-12-07 10:51:00