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

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

题目描述:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例说明请见LeetCode官网。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:递归法
  • 首先,如果p或q是根节点,直接返回根节点。
  • 如果p和q都不是根节点,则分以下几种情况处理:
    • 如果p和q的值都小于root的值,则递归调用该方法lowestCommonAncestor,入参为 root.left
    • 如果p和q的值都小于root的值,则递归调用该方法lowestCommonAncestor,入参为 root.right
    • 如果p和q一个大于root的值,另一个小于root的值,则p和q的最近公共祖先只可能是root,所以直接返回root。
public class LeetCode_235 {
    /**
     * 递归法
     *
     * @param root
     * @param p
     * @param q
     * @return
     */
    public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        // 如果p或q是根节点,直接返回根节点
        if (p == root) {
            return p;
        }
        if (q == root) {
            return q;
        }
        if (p.val < root.val && q.val < root.val) {
            // 如果p和q的值都小于root的值,则递归调用该方法,入参为 root.left
            return lowestCommonAncestor(root.left, p, q);
        } else if (p.val > root.val && q.val > root.val) {
            // 如果p和q的值都大于root的值,则递归调用该方法,入参为 root.right
            return lowestCommonAncestor(root.right, p, q);
        } else {
            // 如果p和q一个大于root的值,另一个小于root的值,则p和q的最近公共祖先只可能是root,所以直接返回root
            return root;
        }
    }

    public static void main(String[] args) {
        // 初始化一颗二叉搜索树
        TreeNode root = new TreeNode(6);
        TreeNode node_2 = new TreeNode(2);
        TreeNode node_8 = new TreeNode(8);
        root.left = node_2;
        root.right = node_8;
        root.left.left = new TreeNode(0);
        root.left.right = new TreeNode(4);
        root.left.right.left = new TreeNode(3);
        root.left.right.right = new TreeNode(5);
        root.right.left = new TreeNode(7);
        root.right.right = new TreeNode(9);

        // 调用方法,返回结果
        TreeNode result = lowestCommonAncestor(root, node_2, node_8);
        System.out.println(result.val);
    }
}

【每日寄语】 不是境况造就人,而是人造就境况。

posted @   醉舞经阁  阅读(24)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示