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

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

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

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


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

百度百科中最近公共祖先的定义为:“对于有根树 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;
            }
        }
    }

你可能感兴趣的:(算法与数据结构,二叉搜索树,最近公共祖先)