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

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

门 | GATE-CS-2017(套装2)|问题 25

题目描述: 一个二叉搜索树中,已知两个节点 P 和 Q,找到它们的最近公共祖先。

例如,在下面的 BST 中,4 和 6 的最近公共祖先是 5。

graph TD
    5 --> 2
    5 --> 6
    2 --> 1
    2 --> 4
    4 --> 3

程序:

class Node:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

def lowestCommonAncestor(root: 'Node', p: 'Node', q: 'Node') -> 'Node':
    while (root.val - p.val) * (root.val - q.val) > 0:
        root = root.left if p.val < root.val else root.right
    return root

解释:

此题是一道二叉搜索树的题目,要求找到节点 P 和 Q 的最近公共祖先。

由于是二叉搜索树,所以可以根据节点的大小关系来逐层逼近最近公共祖先。因为二叉搜索树的性质,若节点 P 和 Q 分别位于根节点的左右两侧,则根节点即为最近公共祖先。

若节点 P 和 Q 位于根节点的同一侧,则继续向下寻找最近公共祖先,直到找到。

因此,我们可以利用循环来寻找 P 和 Q 的最近公共祖先,按照节点大小关系不断更新根节点,直到找到最近公共祖先。

时间复杂度为 O(h),其中 h 为树的高度,即从根节点到最底层节点的距离。因为在二叉搜索树中,树高一般为 logn,所以该算法的时间复杂度是 O(logn)。

参考资料: [1] 《算法竞赛进阶指南》 [2] https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/