📌  相关文章
📜  二叉树中任意数量节点的最小公共祖先(1)

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

二叉树中任意数量节点的最小公共祖先

当在二叉树上寻找两个节点的最小公共祖先时,我们只需要考虑他们之间的路径。如果这两个节点分别在左子树和右子树中,那么它们的最小公共祖先就是当前节点。如果这两个节点都在左子树或右子树中,则递归到相应子树中再进行相同的操作。

现在考虑同样问题的更一般版本:在一颗二叉树上找到任意数量节点的最小公共祖先。我们可以使用以下递归思路解决这个问题:

  1. 递归访问整棵树,对于当前节点 node ,我们需要知道在以它为根的子树中是否存在所有要查找的节点,以及如果有,是否在同一个子树中;
  2. 根据第一个问题,我们进行递归,对左右子树都进行同样的操作;
  3. 如果左右子树中都找到了所有要查找的节点,那么当前节点即为最小公共祖先;
  4. 如果只在左子树或右子树中找到了所有要查找的节点,那么返回它们的公共祖先;
  5. 如果只在某一个子树中找到了其中一部分要查找的节点,那么返回找到的节点;

具体实现如下:

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

class Solution:
    def lowestCommonAncestor(self, root: TreeNode, nodes: List[TreeNode]) -> TreeNode:
        if not root or not nodes:
            return None
        if root in nodes:
            return root
        left_res = self.lowestCommonAncestor(root.left, nodes)
        right_res = self.lowestCommonAncestor(root.right, nodes)
        if left_res and right_res:
            return root
        elif left_res:
            return left_res
        elif right_res:
            return right_res

其中,nodes 为要查找的节点的列表。递归访问整棵树,如果当前节点在要查找的节点列表中,立即返回该节点。如果不在,对左右子树进行递归,然后根据左右子树的返回值判断最小公共祖先是否出现,以及需要返回的节点是哪个。如果左右子树都不为空,则当前节点为最小公共祖先;如果只有左子树或右子树不为空,则返回左右子树中其中一个节点;如果左右子树都为空,则返回 None