📅  最后修改于: 2023-12-03 14:49:01.269000             🧑  作者: Mango
在二叉树中,两个节点的"最低共同祖先"(Lowest Common Ancestor,LCA)是指两个节点的公共祖先中,深度最低的一个。本篇文章将介绍如何在二叉树中找到最低共同祖先。
首先,容易想到的是暴力法,即分别寻找两个节点的祖先链表,然后一个一个比较,找到最后一个公共节点即为最低共同祖先。但是这个方法的时间复杂度为O(N^2),不可行。
考虑在一次遍历中,同时查找两个节点,且不会重复查找已经遍历过的节点。这时可以用递归遍历二叉树。从根节点开始递归,若当前节点为p或q,直接返回当前节点;否则,递归遍历左右子树,若左右子树都不为空,则说明p、q分别在左右子树中,当前节点为它们的最低公共祖先;若左子树为空,则说明在右子树中;若右子树为空,则说明在左子树中。
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', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root: # root为空
return None
if root == p or root == q: # 当前节点为p或q
return root
left = self.lowestCommonAncestor(root.left, p, q) # 在左子树中查找
right = self.lowestCommonAncestor(root.right, p, q) # 在右子树中查找
if left and right: # p、q分别在左右子树中
return root
return left if left else right # 返回结果
LCA问题是二叉树相关算法中的重要问题,本文介绍了一种基于递归遍历二叉树的方法,可以在一次遍历中找到两个节点的最低共同祖先。这种方法的时间复杂度为O(N),空间复杂度为O(N),效率较高。