您对允许使用的 RAM 数量有极端限制吗?如果没有,我会提出这样的建议:
visited_nodes = {} // something like a HashMap, with O(1) insert and retrieval
node1 = p
node2 = q
while True:
if node1 == null and node2 == null: // the nodes don't seem to be in same tree
return null // or failure or anything like that
if node1 is not null:
if node1 in visited_nodes: // node1 must be lowest common ancestor
return node1
else:
visited_nodes.insert(node1) // remember that we've seen this node
node1 = node1.getParent()
if node2 is not null:
if node2 in visited_nodes: // node2 must be lowest common ancestor
return node2
else:
visited_nodes.insert(node2) // remember that we've seen this node
node2 = node2.getParent()
直观的想法如下。我们同时从两个节点开始。在循环的每一次迭代中,我们从两个节点都上移一步。每当我们看到一个节点时,我们就把它放在我们的地图中(它应该有 O(1) 的插入和检索/检查它是否已经在那里)。当我们遇到已经放入地图的节点时,这一定是我们的解决方案。
此代码的运行时间不应超过max(d_p, d_q)
迭代,其中d_p
和d_q
分别表示树中的深度级别p
和q
。如果两个节点碰巧都非常靠近根,这将是一个很大的优势。这也意味着代码甚至适用于无限树(而您的解决方案会陷入无限循环)。