📌  相关文章
📜  二叉树中的最低共同祖先 |设置 1(1)

📅  最后修改于: 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),效率较高。