📜  门|门 CS 1997 |问题 18(1)

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

《门|门 CS 1997》问题 18

这个问题考察了程序员对递归和树的理解以及应用。问题描述如下:

给定一颗二叉树T和两个节点p,q,找到他们的最近公共祖先节点。

这个问题可以使用递归来解决。

def lowestCommonAncestor(root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
    if not root or root == p or root == q:
        return root
    left = lowestCommonAncestor(root.left, p, q)
    right = lowestCommonAncestor(root.right, p, q)
    if left and right:
        return root
    if left:
        return left
    return right

上面这段代码实现了找到最近公共祖先节点的功能。其中,root表示当前要处理的子树,p和q为要查找最近公共祖先的两个节点。

代码实现的思路是:

  • 如果当前处理的子树为空或者已经找到了p或q,则返回当前子树。
  • 递归查找左子树和右子树中是否有p或q,如果都有,则说明当前的根节点为最近公共祖先节点,返回即可。
  • 如果只有左子树有p或q,则返回左子树查到的结果。
  • 如果只有右子树有p或q,则返回右子树查到的结果。

这样的时间复杂度为O(n),其中n为二叉树中节点的数量。