236. Lowest Common Ancestor of a Binary Tree

本文介绍了一种在二叉树中查找两个指定节点的最低公共祖先(LCA)的算法,提供了C++和Python的实现代码。LCA定义为树中同时拥有p和q作为后代的最深节点,允许节点作为自己的后代。通过递归搜索左右子树来找到p和q,如果它们分别位于根节点的两侧,则根节点即为LCA。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”

Given the following binary tree: root = [3,5,1,6,2,0,8,null,null,7,4]

在这里插入图片描述

Example 1:

Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
Output: 3
Explanation: The LCA of nodes 5 and 1 is 3.
Example 2:

Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
Output: 5
Explanation: The LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.

c++: 递归
以根节点为起点,往左右分支上寻找,如果找到了 p 或 q 节点,则返回该节点。否则,继续向叶子节点寻找,假想一下,如果一直递归到 null 还是找不到该节点,那么说明这个分支上不存在该节点。

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        //如果找到 p 或者 q 那么就没有必要接着递归,因为共同祖先只可能是该节点或该节点祖先
        //如果 root 为空了,说明这条路径上不可能有 p 或 q 节点,返回空
        if (!root || p == root || q == root) return root;
       TreeNode *left = lowestCommonAncestor(root->left, p, q);//往左分支上寻找
       TreeNode *right = lowestCommonAncestor(root->right, p , q);//往右分支上寻找
       if (left && right) return root; //说明 p 和 q 是分布在 root 两侧,返回即可
       return left ? left : right;//说明在 left 分支上找到 p 或 q 节点,返回即可
        
    }
};

python:

class Solution(object):
    def lowestCommonAncestor(self, root, p, q):
        """
        :type root: TreeNode
        :type p: TreeNode
        :type q: TreeNode
        :rtype: TreeNode
        """
        if root == None or root == p or root == q:
            return root
        left = self.lowestCommonAncestor(root.left,p,q)
        right = self.lowestCommonAncestor(root.right,p,q)
        if left==None:
            return right
        elif right ==None:
            return left
        else:
            return root
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值