leetcode 236 Lowest Common Ancestor of a Binary Tree

本文介绍了一种寻找二叉树中两个节点的最低公共祖先(LCA)的算法。该算法通过递归方式,首先确认两个节点是否在同一棵树中,然后根据节点位置判断公共祖先。分为三种情况:节点位于祖先的两侧、同一侧左侧或右侧。通过递归调用,最终返回LCA。

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

*
https://segmentfault.com/a/1190000009429876
首先要先确定给的两个node是否都在tree里,如果都在tree里的话,就可以分成3种情况,
第一种情况是两个节点是在公共祖先的左右两侧,第二种情况是都在树的左侧,
第三种情况是都在树的右侧,如果是第二,第三种情况的话,公共祖先就在给定的两个点中比较上面的那一个。

如果转换成代码的话,从上往下走,base case分为3种,判断遇到了p就直接返回p,遇到q就直接返回q,不用向下做了。
如果left,right都不为空,就返回root自己;left,right哪一个不为空就返回哪个,整个recursion做完就可以得到LCA。
 */
public class no236_LowestCommonAncestorofaBinaryTree {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //三种情况最终都会递归到下面三个if里,然后才能进行下面的判断
        if(root == null) return null;// 这个对应p,q 走在root一边的情况,left 或者right有一个为null
        if(root == p) return p;//
        if(root == q) return q;//
        //分三种情况分别举一个简单的例子就可以理解了
        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、付费专栏及课程。

余额充值