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

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

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

 

 思路:利用二插搜索树的性质,来解决此题,

如果root节点的值大于p和q结点值,那么说明两个结点在root结点的左侧

如果root节点的值小于p和q结点值,那么说明两个结点在root结点的右侧

如果root节点的值大于p结点的值且小于q结点的值,那么p、q公共祖先就是root结点

代码如下:

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) return null;
        // p.val < root.val < q.val  return root
        if (root.val >= p.val && root.val <= q.val) {
            return root;
        }
        // p.val和q.val都小于root.val  表明在左树
        if (root.val > q.val && root.val > p.val) {
            return lowestCommonAncestor(root.left, p, q);
        } else if(root.val < q.val && root.val < p.val) {
            // p.val和q.val都大于root.val  表明在右树
            return lowestCommonAncestor(root.right, p, q);
        }
        return root;
}

以上代码可以直接写成如下代码:

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q){
        //如果小于等于0,说明p和q位于root的两侧,直接返回即可
        // 强转long类型原因:如果等式乘积为负,且乘数和被乘数数值过大,那么就会超过int的范围,就会变成正值
        if ((long)(root.val - p.val) * (root.val - q.val) <= 0)
            return root;
        //否则,p和q位于root的同一侧,就继续往下找
        return lowestCommonAncestor(p.val < root.val ? root.left : root.right, p, q);
}

 

posted @ 2022-09-15 10:13  码到成功hy  阅读(29)  评论(0编辑  收藏  举报
获取

hahah

name age option