📜  门| GATE-CS-2017(套装2)|问题 28(1)

📅  最后修改于: 2023-12-03 15:12:44.433000             🧑  作者: Mango

问题 28

这是一道关于树的问题。给定一棵二叉搜索树(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

要使用上述代码,需要在二叉搜索树中找到相应的节点 pq。这里我们也提供一下用于构建二叉搜索树的代码:

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 来查找节点 pq 的最低公共祖先:

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 的路径上,且它是深度最浅的节点。