题解 | #二叉搜索树的最近公共祖先#

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

https://www.nowcoder.com/practice/d9820119321945f588ed6a26f0a6991f

思路

对于二叉树搜索树来说,由于左子树全部值小于根节点值小于右子树全部值,所以我们定位元素的位置其实也简单。

对于两个元素位置一般就两种情况:

  1. 两个节点一个为父节点一个为子节点,那么这个父节点便是两个节点的祖先节点
  2. 两个节点位置相对一个在左一个在右,那么两个节点的祖先节点便是查找分叉时的根节点

代码

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param root TreeNode类
     * @param p    int整型
     * @param q    int整型
     * @return int整型
     */
    public int lowestCommonAncestor(TreeNode root, int p, int q) {
        // 判断目标值大小
        if (p > q) {
            return findTheAncestorNode(root, p, q);
        } else {
            return findTheAncestorNode(root, q, p);
        }
        // 二叉搜索树的最近公共节点
    }

    /**
     * 传入根节点与两个目标值,返回祖先节点值
     *
     * @param root 根节点
     * @param p    目标1 默认更大
     * @param q    目标2 默认更小
     * @return int 祖先节点值
     * @apiNote
     * @since 2023/1/4 20:11
     */
    public int findTheAncestorNode(TreeNode root, int p, int q) {
        // 目标值同时在左边
        if (root.val > p && root.val > q) {
            // 递归的调用方法向左继续查找
            return findTheAncestorNode(root.left, p, q);
        }
        // 目标值同时在右边
        else if (root.val < p && root.val < q) {
            // 递归的调用方法向右继续查找
            return findTheAncestorNode(root.right, p, q);
        }
        // 如果目标值小的在左,大的在右,说明,当前节点即是祖先节点(查找分叉点)
        else if (root.val < p && root.val > q) {
            return root.val;
        }
        // 如果目标值大的等于节点值,返回该目标值,如果目标值小的等于节点值,也返回该节点目标值
        else {
            // 如果目标值大的等于节点值,返回该目标值
            if (root.val == p) {
                return p;
            }
            // 如果目标值小的等于节点值,也返回该节点目标值(当然两个目标值相等的情况不可能发生)
            return q;
        }
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 11:45
你不要过来啊啊啊啊啊啊啊
码农索隆:对面:“今天你不面也得面”
点赞 评论 收藏
分享
06-17 00:26
门头沟学院 Java
程序员小白条:建议换下项目,智能 AI 旅游推荐平台:https://github.com/luoye6/vue3_tourism_frontend 智能 AI 校园二手交易平台:https://github.com/luoye6/vue3_trade_frontend GPT 智能图书馆:https://github.com/luoye6/Vue_BookManageSystem 选项目要选自己能掌握的,然后最好能自己拓展的,分布式这种尽量别去写,不然你只能背八股文了,另外实习的话要多投,尤其是学历不利的情况下,多找几段实习,最好公司title大一点的
无实习如何秋招上岸
点赞 评论 收藏
分享
每晚夜里独自颤抖:你cet6就cet6,cet4就cet4,你写个cet证书等是什么意思。专业技能快赶上项目行数,你做的这2个项目哪里能提现你有这么多技能呢
点赞 评论 收藏
分享
码农索隆:有点耳熟,你们是我教过最差的一届
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务