欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-14 14:38:16
...

二叉搜索树,是常见的树形结构,其搜索效率比较高。

如果对二叉搜索树不熟悉,可以看之前的博客:二叉搜索树

下面看一道二叉搜索树的算法题目,leetcode地址
leetcode 235. 二叉搜索树的最近公共祖先


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

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

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

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

示例 2:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
 

说明:
所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉搜索树中。

根据二叉搜索树的特性,比父节点小的存在于该节点的左子树,大的都存在于右子树。

那么,假设所寻找的最近公共节点记做A, 从开始根节点遍历,当前节点的值,与p、q的值比较,只可能存在三种结果,

  • 当前节点值比两个都要大,A存在于当前节点的左子树
  • 当前节点值比两个都要小,A存在于当前节点的右子树
  • 其它情况,当前节点就是A(这句不理解,拿张纸,写写画画就明白了)

逻辑清楚之后,那代码就比较好写了


public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        TreeNode result = root;
        if(null == result) return root;
        int pVal = p.val;
        int qVal = q.val;
        while(true){
            if(result.val > pVal && result.val > qVal){
                result = result.left;
            }else if(result.val < pVal && result.val < qVal){
                result = result.right;
            }else{
                return result;
            }
        }
    }