📅  最后修改于: 2023-12-03 15:28:45.734000             🧑  作者: Mango
题目描述: 一个二叉搜索树中,已知两个节点 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/