刷刷刷 Day 22 | 235. 二叉搜索树的最近公共祖先

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

LeetCode题目要求

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

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

例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5]

图

示例

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6 
解释: 节点 2 和节点 8 的最近公共祖先是 6。
解题思路

利用二叉树的特性,根据 p q 两个节点值来确定在左子树还是右子树。但无论如何他们的最近公共祖先再试 p q 之间的。
通过递归及二叉搜索树的特点,来判断 p q 位置,如果同时小于当前节点值,那么在左子树递归,如果同时大于当前节点值,那么在右子树递归。

上代码

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {

        // 二叉搜索树的特性。确定 p q 的位置,在左侧 还是在 右侧

        // 确定终止条件
        if (root == null) {
            return null;
        }

        // 如果 p q 在左子树,
        if (root.val > p.val && root.val > q.val) {
            return lowestCommonAncestor(root.left, p, q);
        }

        // 如果 p q 在右子树
        if (root.val < p.val && root.val < q.val) {
            return lowestCommonAncestor(root.right, p, q);
        }

        return root;
    }
}
重难点

附:学习资料链接

posted @ 2023-01-25 20:49  blacksonny  阅读(10)  评论(0编辑  收藏  举报