LeetCode 二叉树的最近公共祖先(236题)三种解法详解

这篇博客详细解析了LeetCode 236题——二叉树的最近公共祖先的三种解法:1)基于路径的方法,2)基于求父节点的方法,3)递归方法。通过示例和代码解释了每种方法的思路,适合学习二叉树和算法的读者。
摘要由CSDN通过智能技术生成

LeetCode 二叉树的最近公共祖先

@author:Jingdai
@date:2020.11.06

题目描述(236题)

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

注意:一个节点也可以是它自己的祖先。

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉树中。

题目分析

在这里插入图片描述

如图,二叉树的公共祖先分成两种情况。第一种情况是两个节点 pq 分别位于最近公共祖先的异侧。第二种情况是两个节点 pq 其一就是他们的公共祖先,另一个节点位于它的子树中。

思路及代码

对于上面的分析,这里使用三种方式解决这个问题。

方法1:基于路径的方法

不管最近公共祖先是上面的情况1还是情况2,我们都可以根据根节点到节点 p 和根节点到节点 q 的的路径求出最近公共祖先。

在这里插入图片描述

如图,对于情况1,根节点到节点3的路径为 [0, 1, 3] ,根节点到节点2的路径为 [0, 2] ,最近公共祖先就是最后一个相同的节点 0 。

对于情况2,根节点到节点5的路径为 [0, 1, 3, 5] ,根节点到节点1的路径为 [0, 1] ,最近公共祖先还是最后一个相同的节点 1 。

综上,可以先求出根节点到节点 p 和根节点到节点 q 的路径,然后求出两个路径中最后一个相同的节点就是最近公共祖先。

接下来的问题就是如何求根节点到某节点的路径了,可以参考之前的博客 求二叉树根节点到指定节点的路径。下面是完整的代码。

代码
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
   

    LinkedList<TreeNode> pPath = new LinkedList<>();
    getPathToTarget(root, p, pPath);
    LinkedList<TreeNode> qPath = new LinkedList<>();
    getPathToTarget(root, q, qPath);

    TreeNode ancestor = null;
    while (true) {
   
        if (pPath.size() 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值