📌  相关文章
📜  教资会网络 | UGC-NET CS 2017 年 12 月 2 日 |问题 37(1)

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

UGC-NET CS 2017 年 12 月 2 日 | Question 37

题目描述:在给定的二叉搜索树中,找到两个节点的最小公共祖先。

二叉搜索树是具有以下属性的二叉树:

  • 左子树中所有节点的值都小于根节点的值;
  • 右子树中所有节点的值都大于根节点的值;
  • 对象可以包含重复值。
解法

可以使用递归方法来解决问题。

如果根节点的值比两个节点的值都大,那么最小公共祖先一定在左子树中;如果根节点的值比两个节点的值都小,那么最小公共祖先一定在右子树中;否则,根节点就是最小公共祖先。

def lowest_common_ancestor(root, p, q):
    """
    :type root: TreeNode
    :type p: TreeNode
    :type q: TreeNode
    :rtype: TreeNode
    """
    if root is None or root == p or root == q:
        return root

    left = lowest_common_ancestor(root.left, p, q)
    right = lowest_common_ancestor(root.right, p, q)

    if left is None:
        return right
    elif right is None:
        return left
    else:
        return root
复杂度分析

时间复杂度:O(n),其中 n 为二叉搜索树中节点的个数。在最坏的情况下,需要递归遍历整棵树。

空间复杂度:O(n)。在最坏的情况下,递归调用栈将达到深度 n。