我提出以下問題在面試:這個最不常見的祖先算法有什麼問題?
給出一個根節點(到井形成二叉樹)和其他兩個節點(這是保證在樹上,並且也不同) ,返回兩個節點的最低共同祖先。
我不知道任何最不常見的祖先算法,所以我試圖在現場製作一個。我公司生產的以下代碼:
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