力扣235. 二叉搜索树的最近公共祖先

文章讲述了如何利用二叉搜索树的性质,通过中序遍历特性,在O(logN)时间内在前序遍历结构中找到两个节点的最低公共祖先。方法基于递归,分为三种情况:根值大于、小于或介于p和q的值,分别决定向左、右子树或直接返回根节点。

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

在这里插入图片描述
思路:要利用好二叉搜索树的特性,中序遍历是有序的,也就是说最近的公共祖先 大小一定落在区间 [p,q] 或[q,p]。
1、当p和q都大于当前root值时,说明当前root值太小,需要更大才能让它落入区间范围,所以要往右子树去遍历;
2、当p和q都小于当前root值时,同理,往左子树去遍历;
3、最后剩下情况就是 root值 在p值和q值之间的情况了,直接返回root。

这里是前序遍历中左右,从上到下,但是这里中不用处理;
实际代码中,log(N)时间复杂度。


class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null) return null;
        //如果root值比两个值都大,说明公共节点在左子树
        if(root.val > p.val && root.val > q.val) {
            return lowestCommonAncestor(root.left,p,q);
        }
        //同理
        if(root.val < p.val && root.val < q.val) {
            return lowestCommonAncestor(root.left,p,q);
        } 
        //剩下的是 root值 在p值和q值之间的情况
        return root;       
        
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值