📅  最后修改于: 2023-12-03 15:36:03.262000             🧑  作者: Mango
当在二叉树上寻找两个节点的最小公共祖先时,我们只需要考虑他们之间的路径。如果这两个节点分别在左子树和右子树中,那么它们的最小公共祖先就是当前节点。如果这两个节点都在左子树或右子树中,则递归到相应子树中再进行相同的操作。
现在考虑同样问题的更一般版本:在一颗二叉树上找到任意数量节点的最小公共祖先。我们可以使用以下递归思路解决这个问题:
node
,我们需要知道在以它为根的子树中是否存在所有要查找的节点,以及如果有,是否在同一个子树中;具体实现如下:
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
。