📅  最后修改于: 2023-12-03 15:33:16.348000             🧑  作者: Mango
在树中,两个节点之间的所有公共祖先节点集合就是这两个节点之间的有序序列。这样的话,我们只需要比较这两个节点的有序序列,找到最后一个相同的节点就是它们之间的公共节点。
为了方便说明,我们假设这棵树是一棵二叉搜索树,即左子树上所有节点的值小于父节点的值,右子树上所有节点的值大于父节点的值。
我们可以从根节点开始,比较当前节点和两个给定节点的值的大小关系:
这种方法只需要常数级别的空间,因为我们只需要存储当前节点和两个给定节点的值,而不需要使用任何数据结构来存储路径或者遍历过程中的中间结果。
以下是基于 Python 的实现代码:
class TreeNode:
def __init__(self, val=None, left=None, right=None):
self.val = val
self.left = left
self.right = right
def lowest_common_ancestor(root, p, q):
while root:
if root.val < p.val and root.val < q.val:
root = root.right
elif root.val > p.val and root.val > q.val:
root = root.left
else:
return root
这个函数接受一个根节点和两个节点 p
和 q
,返回 p
和 q
之间的公共节点。
具体用例:
A = TreeNode(6)
B = TreeNode(2)
C = TreeNode(8)
D = TreeNode(0)
E = TreeNode(4)
F = TreeNode(7)
G = TreeNode(9)
H = TreeNode(3)
I = TreeNode(5)
A.left = B
A.right = C
B.left = D
B.right = E
C.left = F
C.right = G
E.left = H
E.right = I
print(lowest_common_ancestor(A, D, F).val) # 输出 6
这个例子中,两个节点 D
和 F
的公共节点就是根节点 A
。