📅  最后修改于: 2023-12-03 15:12:44.433000             🧑  作者: Mango
这是一道关于树的问题。给定一棵二叉搜索树(BST),我们需要找出两个节点之间的最低(最近)共同祖先(LCA)。树上每个节点的值都是独一无二的。
我们可以利用二叉搜索树的性质:左子树的所有节点的值都小于根节点的值,右子树的所有节点的值都大于根节点的值。因此,当我们要查找两个节点的最低公共祖先时,可以从根节点开始比较。如果根节点的值大于两个节点的值,则最低公共祖先在左子树中;如果根节点的值小于两个节点的值,则最低公共祖先在右子树中;如果根节点的值在两个节点的值之间,则最低公共祖先就是根节点。
我们可以利用递归算法来实现这一过程。具体来说,从根节点开始比较,如果根节点的值小于或等于两个节点的值,则递归到右子树中查找;如果根节点的值大于两个节点的值,则递归到左子树中查找;否则,根节点就是最低公共祖先。
下面是用 Python 实现的代码:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def lowestCommonAncestor(root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
if root is None or p is None or q is None:
return None
if root.val < p.val and root.val < q.val:
return lowestCommonAncestor(root.right, p, q)
elif root.val > p.val and root.val > q.val:
return lowestCommonAncestor(root.left, p, q)
else:
return root
要使用上述代码,需要在二叉搜索树中找到相应的节点 p
和 q
。这里我们也提供一下用于构建二叉搜索树的代码:
def insert(root: TreeNode, val: int) -> TreeNode:
if root is None:
return TreeNode(val=val)
if val < root.val:
root.left = insert(root.left, val)
elif val > root.val:
root.right = insert(root.right, val)
return root
def buildBinarySearchTree(values: List[int]) -> TreeNode:
root = None
for val in values:
root = insert(root, val)
return root
使用上述代码构建二叉搜索树的例子:
values = [6, 2, 8, 0, 4, 7, 9, 3, 5]
root = buildBinarySearchTree(values)
该代码将创建以下二叉搜索树:
6
/ \
2 8
/ \ / \
0 4 7 9
/ \
3 5
我们可以调用函数 lowestCommonAncestor
来查找节点 p
和 q
的最低公共祖先:
p = TreeNode(val=3)
q = TreeNode(val=5)
lca = lowestCommonAncestor(root, p, q)
print(lca.val) # 输出 4
因为节点 p.val = 3
和节点 q.val = 5
都小于节点 lca.val = 4
,所以节点 lca
在节点 p
和节点 q
的路径上,且它是深度最浅的节点。