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

185 阅读1分钟

题目描述

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

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

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

image.png

示例 1:

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

思路

  1. 明确二叉搜索树的特性:左<中<右
  2. 本题与 寻找二叉树的最近公共父节点 类似,甚至直接使用 寻找二叉树的最近公共父节点的代码都可以直接 AC,但二叉搜索树有着非常良好的特性,我们可以利用它的特性,这样便可以不用遍历所有节点了。
  3. 如何利用二叉搜索树的特性呢?
  • 若p,q大于root,直接在root的右子树中去寻找。
  • 若p,q小于root,直接在root的左子树中去寻找。
  • 若p,q等于root,那root就是它们的最近公共父节点。

代码

    function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null {
        if(root==null) return root;

        //左
       
        if(root.val>Math.max(p.val,q.val)){
           return  lowestCommonAncestor(root.left,p,q);
        }

        //右
        if(root.val<Math.min(p.val,q.val)){
           return lowestCommonAncestor(root.right,p,q);
        }

        if((p.val<root.val&&root.val<q.val)||(q.val<root.val&&root.val<p.val)||root.val==p.val||root.val==q.val){
            return root;
        }

    };

image.png

总结

本题与二叉树最近公共祖先思路上是相同的,如有错误之处,欢迎大家留言指出。

image.png