当前位置:网站首页>leetcode刷题:二叉树25(二叉搜索树的最近公共祖先)

leetcode刷题:二叉树25(二叉搜索树的最近公共祖先)

2022-07-07 10:30:00 涛涛英语学不进去

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

力扣题目链接

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

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

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

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

示例 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, 因为根据定义最近公共祖先节点可以为节点本身。

本题用我上一节的通用做法也能做,不过是二叉搜索树,有序,可以针对性质来做。 性质:有序(非递减)

package com.programmercarl.tree;

/** * @ClassName BstLowestCommonAncestor * @Descriotion TODO * @Author nitaotao * @Date 2022/7/6 12:36 * @Version 1.0 * https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/ * 235. 二叉搜索树的最近公共祖先 **/
public class BstLowestCommonAncestor {
    
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    
        //因为是有序的,只要找到最接近两个元素的结点
        // 模板结点在当前结点左边
        if (root.val > p.val && root.val > q.val) {
    
            root = root.left;
        } else if (root.val < p.val && root.val < q.val) {
    
            root = root.right;
        } else {
    
            //root在两个结点位置之间了,是闭区间。而且是 [p,q]的闭区间,不是 p 就是 q
            //因为是一步步位移的,所以是临界点
            return root;
        }
        return lowestCommonAncestor(root, p, q);
    }
}

在这里插入图片描述

原网站

版权声明
本文为[涛涛英语学不进去]所创,转载请带上原文链接,感谢
https://blog.csdn.net/niTaoTaoa/article/details/125639451