236-Lowest Common Ancestor of a Binary Tree

本文介绍了一种寻找二叉树中两个指定节点的最近公共祖先的经典算法。通过后序遍历的方式,当遇到其中一个节点为另一个节点的后代时直接返回该节点,否则返回包含两节点的当前节点。

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

Description

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 v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

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

        _______3______
       /              \
    ___5__          ___1__
   /      \        /      \
   6      _2       0       8
         /  \
         7   4

Example 1:

Input: root, p = 5, q = 1
Output: 3
Explanation: The LCA of of nodes 5 and 1 is 3.

Example 2:

Input: root, 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.

问题描述

给定二叉树和两个节点 ,返回这两个节点的最近公共祖先

根据维基对最近公共祖先的定义, “v和w的最近公共祖先被定义为, 离v和w最近的以v和w为后继节点的节点(允许一个节点为自己的后继)”


问题分析

很经典的题目

首先, 若p为q的子节点, 那么返回q, 若q为p的子节点, 那么返回p

后序遍历, 若当前节点既包含p, 也包含q, 那么返回当前节点, 否则, 返回非空的一方(注意, 这里就包含了p和q, 其中一个节点为另一个节点的子节点这种情况, 若两者都为空, 则返回空)


解法

public class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null || root == p || root == q)  return root;

        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);

        if(left != null && right != null)   return root;
        return left != null ? left : right;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值