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

本文介绍了在二叉搜索树中寻找两个节点最近公共祖先的两种方法:思路1利用迭代,通过比较节点值的乘积判断节点位置;思路2采用递归,当节点值乘积小于等于0时返回当前节点。

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

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

思路1:
  1. 如果 (root.val - p.val) * (root.val - q.val) > 0 ,则代表p,q在同一个子树上,此时根据 (root.val - p.val) 的大小判断同在左子树还是右子树,然后继续到子树中寻找
  2. 如果 (root.val - p.val) * (root.val - q.val) <= 0,则代表 p,q在根节点两边,即此时根节点就是最近公共祖先
  3. 可以代码整合简化成如下:
代码实现
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
         while ((root.val - p.val) * (root.val - q.val) > 0) {
             root = root.val < p.val ? root.right : root.left;
         }//跳出循环时,就已经表示(root.val - p.val) * (root.val - q.val) <= 0,此时返回root即可
         return root;
    }
}
思路2(递归):
  1. 如果 (root.val - p.val) * (root.val - q.val) > 0 ,则代表p,q在同一个子树上,此时根据 (root.val - p.val) 的大小判断同在左子树还是右子树,然后继续到子树中寻找。此处到子树中寻找用递归法
  2. 递归终止条件:(root.val - p.val) * (root.val - q.val) <= 0,说明在root两侧 或者 p或者q此时就是root,直接返回root即可
代码实现
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
         if ((root.val - p.val) * (root.val - q.val) <= 0) return root;

         return lowestCommonAncestor(root.val > p.val ? root.left : root.right, p, q);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值